Writing uncompress PNG one/first Deflate block OK 第二件事出了问题
Writing uncompress PNG one/first Deflate block OK second things go wrong
出于复杂的原因,我想使用 .PNG 标准但不压缩来保存图像。 (和这里差不多:write png quickly)
我发现如果我的图像中有一个 Deflate 块,Windows paint、gimp 等工具可以读取图像并且结果正常。但是一旦我放入第二个 Deflate 块,输出图像就不是我所期望的。
我的代码和“write-png-quickly”的最大区别在于我的第一个 Deflate 块不是 65535 字节。但是如果我阅读 Deflate 标准,我的格式是允许的。我制作了一个 4 像素宽和 2 行高的测试图像。
这是我生成的二进制转储:
0x0000 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
0x0010 00 00 00 04 00 00 00 02 08 02 00 00 00 F0 CA EA
0x0020 34 00 00 00 2A 49 44 41 54 08 1D 00 00 0D FF F2
0x0030 00 01 02 FF 01 02 FF 01 02 FF 01 02 FF 01 00 0D
0x0040 FF F2 00 01 02 FF 01 02 FF 01 02 FF 01 02 FF 60
0x0050 FA 08 11 2F 23 C9 3A 00 00 00 00 49 45 4E 44 AE
0x0060 42 60 82
这是第一个 Deflate:从 00 开始,然后是大小和 ~size(2 个字节),然后是 13 个字节:
0x002B 00 00 0D FF F2 00 01 02 FF 01 02 FF 01 02 FF 01 02 FF
这是第二次 Deflate:从 01 开始,然后又是 13 个字节:
0x003D 01 00 0D FF F2 00 01 02 FF 01 02 FF 01 02 FF 01 02 FF
事实上,它都适用于一个 Deflate 块,这让我有理由相信其余的,如 CRC、阿德勒校验和是可以的。
这些工具一定不能正确检查错误,因为您的单个存储块也被弄乱了。
长度需要小-endian 顺序。你让它们按大端顺序排列。所以第一个块应该开始于:00 0D 00 F2 FF
.
出于复杂的原因,我想使用 .PNG 标准但不压缩来保存图像。 (和这里差不多:write png quickly)
我发现如果我的图像中有一个 Deflate 块,Windows paint、gimp 等工具可以读取图像并且结果正常。但是一旦我放入第二个 Deflate 块,输出图像就不是我所期望的。
我的代码和“write-png-quickly”的最大区别在于我的第一个 Deflate 块不是 65535 字节。但是如果我阅读 Deflate 标准,我的格式是允许的。我制作了一个 4 像素宽和 2 行高的测试图像。 这是我生成的二进制转储:
0x0000 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
0x0010 00 00 00 04 00 00 00 02 08 02 00 00 00 F0 CA EA
0x0020 34 00 00 00 2A 49 44 41 54 08 1D 00 00 0D FF F2
0x0030 00 01 02 FF 01 02 FF 01 02 FF 01 02 FF 01 00 0D
0x0040 FF F2 00 01 02 FF 01 02 FF 01 02 FF 01 02 FF 60
0x0050 FA 08 11 2F 23 C9 3A 00 00 00 00 49 45 4E 44 AE
0x0060 42 60 82
这是第一个 Deflate:从 00 开始,然后是大小和 ~size(2 个字节),然后是 13 个字节:
0x002B 00 00 0D FF F2 00 01 02 FF 01 02 FF 01 02 FF 01 02 FF
这是第二次 Deflate:从 01 开始,然后又是 13 个字节:
0x003D 01 00 0D FF F2 00 01 02 FF 01 02 FF 01 02 FF 01 02 FF
事实上,它都适用于一个 Deflate 块,这让我有理由相信其余的,如 CRC、阿德勒校验和是可以的。
这些工具一定不能正确检查错误,因为您的单个存储块也被弄乱了。
长度需要小-endian 顺序。你让它们按大端顺序排列。所以第一个块应该开始于:00 0D 00 F2 FF
.