Tag: png

IDG PNG文件格式块

我目前正在开发基于png文件格式的专有文件格式。 到目前为止我完成了,除了它不起作用:-p我实现的deflate解压缩器就像魅力一样,但是png解码器不想很好地执行所以我看了一下原来的png文件。 标准说,在IDAT标题之后,压缩数据立即跟随。 因此,当数据是deflate流时,IDAT之后的第一个字符是0x78 == 01111000,这意味着,模式一个块(未压缩)而不是最后一个。 奇怪的是 – 我很难想象PNG编码器不使用动态霍夫曼编码来压缩滤波后的原始图像数据。 deflate标准表示在模式1中跳过当前字节的其余部分。 因此接下来的四个字节表示未压缩块的大小及其一个补码。 但是0x59FD不是0xECDA的一个补码。 即使我搞砸了字节顺序:0xFD59也不是0xDAEC的一个补码。 好吧,淘汰赛字节紧随其后。 0x97被认为是未压缩但仍过滤的原始png图像数据的第一个字节,因此必须是filtertype。 但是0x97 == 10010111不是有效的filter类型。 事件,如果我搞砸了位打包顺序11101001 == 0xe9仍然没有有效的filter类型。 我不再那么关注RFC 1951,因为到目前为止我能够使用我的deflate解压缩程序实现所有类型的文件,所以我怀疑在我的部分中有一些误解,我认为PNG标准。 我一遍又一遍地阅读RFC 2083但是我在这里看到的数据与RFC不匹配,对我来说没有意义,必须有一个缺失的部分! 当我查看以下字节时,实际上我无法在任何地方看到有效的filter类型字节,这使得我认为过滤后的png数据流毕竟是压缩的。 如果将0x78(IDAT之后的第一个字节)从MSB读取到LSB,但RFC 1951则另有说明,这是有意义的。 另一个想法(对我来说更可能)是IDAT字符串和压缩的deflate流的开始之间存在一些数据,但RFC 2083则另有说明。 布局很清楚 4Bytes大小4Bytes ChunkName(IDAT)[大小]字节(压缩放气流)4Bytes CRC校验和 因此,IDAT之后的第一个字节必须是压缩的deflate流的第一个字节 – 这表示模式1未压缩的数据块。 这意味着0x97必须是未压缩但已过滤的png图像数据的第一个字节 – 这意味着0x97是第一行的过滤类型 – 这是无效的… 我只是不明白,我是愚蠢还是什么? 总结:可能性1:在IDAT和压缩的deflate流的有效启动之间还有一些其他的数据,如果这些数据呈现为真,则在RFC2083和我读过的任何关于图像压缩的书中都没有提及。 可能性2:数字0x78被解释为MSB – > LSB,这表示模式3块(动态霍夫曼编码),但这与RF1951相矛盾,RF1951对比特打包非常清楚:(LSB – > MSB) 我已经知道了,丢失的部分必须是非常愚蠢的东西,如果Stack Overflow中只有一个删除按钮,我会觉得急需出售我的灵魂:-p

在Mac OS X mavericks中找不到

我试过(显然是成功的)在mac os x mavericks上安装libpng 。 我下载了最新的1-6-8版本.tar.xz并按照说明操作。 ./configure运行正常 make check除了跳过的png-error之外的所有内容 从我的库libpng开始, sudo make install显然工作正常。 出现。 现在,当我尝试编译我需要编译的C文件时,使用字符串 clang -w -lz -lpng16 libpng_test.c 我收到了错误 fatal error: ‘png.h’ file not found #include 显然它不会编译。 我尝试用homebrew和macports安装它们似乎总是运行正常,但我总是得到同样的错误

具有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 […]

如何使用libpng将PNG编码为缓冲区?

我目前正在使用以下内容将PNG写入文件: #include #include #include #include /* Pixels in this bitmap structure are stored as BGR. */ typedef struct _RGBPixel { uint8_t blue; uint8_t green; uint8_t red; } RGBPixel; /* Structure for containing decompressed bitmaps. */ typedef struct _RGBBitmap { RGBPixel *pixels; size_t width; size_t height; size_t bytewidth; uint8_t bytes_per_pixel; } RGBBitmap; /* Returns pixel of […]