具有IDAT的调色板基本PNG,其BTYPE = 00,无压缩,现在使用Adler32代码

我正在研究一些代码,它们可以构建基于调色板的简单PNG文件,而不需要libpng。 输出文件,在此阶段只有IHDR,PLTE,IDAT(x3)和IEND块。 唯一可能有点不同的是,IDAT块中的像素索引值未被压缩,即各种zlib /块头字节如下。

  • CMF = 0x78。
  • FLG = 0x9C(此处还有一些其他值,但总是清零第5位)。
  • 块头字节= 0x01(BFINAL = 1,BTYPE = 00)。

从我可以看到代码正确构建文件,但是一些图像查看器拒绝完全显示图像,如果有的话。

  • MS Paint很高兴。
  • GIMP很高兴。
  • LibreOffice Draw很开心。
  • Ristretto >>读取PNG图像文件时出现致命错误:压缩数据不够。
  • ImageMagick >>识别:没有足够的图像数据`20160317_PNG_064.png’@ error / png.c / MagickPNGErrorHandler / 1645。
  • Gnome之眼>>没有足够的图像数据。

我已经通过几个不同的工具放置文件,同样混合结果。

  • optipng >>没有足够的图像数据。
  • pngchunks不会报告任何错误。
  • pngcheck不会报告任何错误。

这是文件20160317_PNG_064.png的hex视图

它产生的图片是这个小的8×8像素图像 。

关于接下来要尝试什么,我有点死路一条。 任何和所有的帮助表示赞赏。

EDIT_000根据@Mark Adler的要求,将问题缩小到Adler32计算是用于在主函数中使用测试数据计算Adler32值的代码。 顺便说一句,它不是很花哨,而且编码非常冗长。

#include  #define DEBUG static const unsigned long GC_ADLER32_BASE = 0xFFF1; // Largest prime smaller than 65536 is 65521. unsigned long Adler32_Update ( unsigned long Adler32, unsigned char *Buffer, unsigned int BufferLength ) { unsigned long ulW0; unsigned long ulW1; unsigned int uiW0; #ifdef DEBUG printf("\n"); printf(" Incoming Adler32 value.................0x%.8X\n", Adler32); #endif ulW0 = Adler32 & 0xFFFF; ulW1 = (Adler32 >> 0x0010) & 0xFFFF; #ifdef DEBUG printf(" Inital sum values are..................0x%.8X, 0x%.8X\n", ulW0, ulW1); #endif for (uiW0 = 0x0000; uiW0 < BufferLength; uiW0 = uiW0 + 0x0001) { ulW0 = (ulW0 + Buffer[uiW0]) % GC_ADLER32_BASE; ulW1 = (ulW1 + ulW0) % GC_ADLER32_BASE; } #ifdef DEBUG printf(" Final sum values are...................0x%.8X, 0x%.8X\n", ulW0, ulW1); #endif Adler32 = (ulW1 << 0x0010) | ulW0; #ifdef DEBUG printf(" Outgoing Adler32 value.................0x%.8X\n", Adler32); #endif return (Adler32); } unsigned long Adler32_Get ( unsigned char *Buffer, unsigned int BufferLength ) { unsigned long Adler32; Adler32 = 0x00000001L; Adler32 = Adler32_Update(Adler32, Buffer, BufferLength); return (Adler32); } int main ( unsigned int argc, unsigned char *arg[] ) { unsigned long Adler32; unsigned char data[272] = { 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02 }; Adler32 = Adler32_Get(data, sizeof(data)); printf("\n"); printf("The Adler32 value is ..........................0x%.8X\n", Adler32); return(0x00); } 

无论计算Adler-32值是多少都是不正确的。 数据的正确Adler-32值为0x10080061 ,应该作为10 08 00 61存储在流中。 如果我在链接文件中修复它,并为该块创建一个新的CRC,那么一切都很好。

固定图像是:

固定

作为PNG规范的共同作者,我相信这个文件是完全合规的。 PNG规范将“deflate”的定义推迟到RFC 1951,并且RFC明确允许BTYPE = 0部分。 您可能希望联系那些有问题的程序的作者并报告错误,将您的文件作为样本输入附加。

Interesting Posts