Skip to content

感谢AI,感谢您的辛勤付出,C#又有了一个可用的图像库,附上JBig2和JPX的一些测试图片 #1

Closed

Description

@Charltsing

JPX_JBig2.zip

我试过开源的各种JBig2 c#图像库,能够全部处理这些测试文件的还没有,能处理样本的8%0~90%就算好的了。如果有时间你可以试试。
图像来自某个网站的测试集,网址我忘记了

如果有条件的话,JPEG2000的各种解码的性能优化也可以尝试一下,这个格式在PDF中很广泛。目前只有官方库能够确保各种格式解码正确,性能也是勉强。试过若干开源第三方库,发现兼容性不行,特别是性能远远不能满足需求。不同的图像库性能差距很大。

JPXDecode.zip
像这个图片,在我的老旧电脑上,使用PhotoDemon打开需要1-2秒,SimdCodecs 比 Magick.NET 略快需要4秒
dlemstra/Magick.NET#1748

Image

Activity

  1. theoractice commented on Oct 30, 2026

    @theoractice

    我让ai看看这个项目,结果它顺手在你的测试集上跑了一遍
    JBIG2:68 / 114 成功
    JPEG 2000:3 / 16 成功(成功的是 balloon.j2c、balloon2.j2k、JPXDecode.jp2)
    失败原因全是它自己明确抛的 NotSupportedException / InvalidDataException:

    36 个:halftone 区域用了 HENABLESKIP,未实现
    12 个:多 tile codestream(12/16/18/30/98/424 tiles),只支持单 tile
    3 个:JP2 带 pclr 调色板盒
    2 个:SDHUFF=1 的 Huffman 符号字典
    2 个:图案字典 GRAYMAX 400 > 255 直接判非法
    各 1 个:MMR 图案字典、refinement 区 TPGRON、符号字典 IARDX 越界
    3 个 jb2 是 PDF 嵌入式流(a.jb2、test.jb2、XeroxWorkCentre5230A_Huffman.jb2),没有 97 4A 42 32 文件头,本来就该由上层带 width/height 调 API
    

    这些正好是回给作者的高价值清单:HENABLESKIP、多 tile、pclr 三项就能覆盖 51/62 个失败。

  2. sdcb commented on Nov 3, 2026

    @sdcb
    Owner

    这条清单非常有价值,谢谢。

    但有一点得先说明:这批测试文件我们没有拿到。仓库里只有我们自己用 opj_compress / jbig2enc 生成的 fixtures,没有 balloon.j2c、balloon2.j2k、JPXDecode.jp2 这些文件,本机也没在别处找到。所以上面这些数字我们无法复现,也没法判断每个文件卡在第一道关口之外还缺什么。

    如果方便的话,希望你能提供这批文件的原始来源(链接或者打包都好,标明许可即可)。拿到之后我们会把它们接进测试,按清单里的分组逐项消掉:HENABLESKIP 和多 tile 在你那份数据里就能覆盖大半,是最划算的两项。

    另外——如果你(或你的 AI)有兴趣直接动手,非常欢迎提 PR。SimdCodecs 现在处于快速发展期,我们会持续维护,也很乐意 review 代码。动手前请先看一下仓库根目录的 AGENTS.md,特别是这几条:

    • clean-room 规则:算法只来自 ITU-T / ISO 规范正文、公开论文和公有领域代码,不读、不移植任何第三方实现的源码;jbig2dec、OpenJPEG 这类参考实现只能当黑盒二进制跑,用来比对输出。
    • 不允许新增编译警告;golden 不许为了让测试通过而重新生成。
    • 每个向量核心都要有标量孪生,且各指令集层级输出必须逐位一致。

    判断正确性的唯一标准是和参考解码器(jbig2dec / opj_decompress)的输出比对,tests/Sdcb.SimdCodecs.Tests/Oracle/README.md 里已写明每个 oracle 怎么装、怎么比对,照着做就行。

  3. theoractice commented on Nov 3, 2026

    @theoractice

    但有一点得先说明:这批测试文件我们没有拿到

    文件就在顶楼的压缩包里啊。

  4. sdcb commented on Nov 4, 2026

    @sdcb
    Owner

    抱歉,之前是我们看漏了:两个压缩包确实就在顶楼,已经下载下来逐个测过了。

    现在已修复(main 上,#4),会在 2.0 中发布。

    本地对 JPX_JBig2.zip + JPXDecode.zip 共 131 个文件的结果:

    JBIG2:112 / 114,每一页都和 jbig2dec 逐像素一致

    • 半调区域 HENABLESKIP(36 个)
    • 图案字典 GRAYMAX > 255(规范里本来就没有 255 的上限,是我们之前的误判)
    • MMR 编码的图案字典 / 半调区域(amb_2)
    • 数据长度未知的 segment:a.jb2、test.jb2、XeroxWorkCentre5230A_Huffman.jb2 这三个 PDF 嵌入流,现在用 Jbig2Decoder.Decode(data, width, height) 能直接解
    • Huffman 编码的符号字典和文本区域(SDHUFF / SBHUFF,标准表 + 自定义表 segment)
    • 精细化区域 TPGRON
    • 多页文件:之前只解第 1 页(像 20123110002.jb2 有 10 页),现在新增了 Jbig2Decoder.DecodeFile(file, pageNumber),用 TryReadFileInfo(file, out w, out h, out pages) 可以拿到页数
    • 剩下 042_13.jb2、042_14.jb2 两个:jbig2dec 也报 FATAL ERROR,按规范读到的是非法值(IARDX 为 OOB、符号号越界),所以现在干净地抛 InvalidDataException,不会崩溃也不会给出错误图像

    JPEG 2000:16 / 16,5/3 无损文件和 OpenJPEG 2.5.4 逐样本一致,9/7 有损文件最大差 1

    • 多 tile(12~424 个)和多 tile-part:逐 tile 解码,内存约等于输出图像加一个 tile
    • 自定义 precinct,以及全部 5 种 progression order(LRCP / RLCP / RPCL / PCRL / CPRL)
    • SOP / EPH 标记,code-block 样式里的分段符号等
    • JP2 调色板 pclr + cmap(lm6 / lm7 / lm10)

    因为这批文件来源和许可都不明确,按仓库规则不会提交进仓库。不过我们加了本地语料测试:设置 SIMDCODECS_ISSUE1_DIR 指向解压目录即可。以后改 JBIG2 / JPEG 2000 解码器都会用这批文件回归一遍。

    性能这次没有专门优化,JPXDecode.jp2 单 tile 的耗时和之前一样。再次感谢这份测试集,非常有用!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions