LibPNG:存储9位灰度图像的最小方法

时间:2016-11-17 02:08:23

标签: png libpng

哪一个使用LibPNG产生最小的9位深度灰度图像?

  1. 16位灰度
  2. 带有alpha的8位GrayScale,将第9位存储为alpha
  3. 还有其他建议吗?
  4. 此外,从8bit GRAY_ALPHA的文档中看,alpha也是8位。是否有可能只有一位灰色的8位灰色?

2 个答案:

答案 0 :(得分:0)

如果存在所有256个可能的灰度级(或可能存在),则必须使用16位G8A8像素。但是,如果不存在一个或多个灰度级,则可以使用该备用级别来实现透明度,并使用8位索引像素或灰度加上tRNS块来标识透明值。

Libpng没有提供检查备用级别是否可用的方法,因此您必须在应用程序中执行此操作。例如,ImageMagick为您做到了这一点:

$ pngcheck -v rgba32.png im_opt.png
File: rgba32.png (178 bytes)
  chunk IHDR at offset 0x0000c, length 13
    64 x 64 image, 32-bit RGB+alpha, non-interlaced
  chunk IDAT at offset 0x00025, length 121
    zlib: deflated, 32K window, maximum compression
  chunk IEND at offset 0x000aa, length 0

$ magick rgba32.png im_optimized.png

$ pngcheck -v im_optimized.png
  File: im_optimized.png (260 bytes)
  chunk IHDR at offset 0x0000c, length 13
    64 x 64 image, 8-bit grayscale, non-interlaced
  chunk tRNS at offset 0x00025, length 2
    gray = 0x00ff
  chunk IDAT at offset 0x00033, length 189
    zlib: deflated, 8K window, maximum compression
  chunk IEND at offset 0x000fc, length 0

PNG规范中没有定义G8A1格式。但alpha通道,无论是0还是255,都能很好地压缩,因此无需担心。请注意,在此测试用例(简单的白色到黑色渐变)中,32位RGBA文件实际上小于“优化的”8位灰度+ tRNS

答案 1 :(得分:0)

  

哪一个使用LibPNG产生最小的9位深度灰度图像?

     

16位灰度

     

带有alpha的8位GrayScale,将第9位存储为alpha

两种格式的字节原始布局非常相似:G2-G1 G2-G1 ...在一种情况下(每个16位值的最高有效字节first),GA GA ...在其他。因为过滤/预测是在字节级别完成的,这意味着在两个备选方案之间预期很少或没有差异。因为16位灰度在您的场景中更自然,我选择它。 如果你走另一条路线,我建议尝试在alpha通道上放置最重要的位或最低位。

  

此外,从8bit GRAY_ALPHA的文档中看,alpha也是8位。是否可能有8位灰色,只有一位alpha

没有。但是1位alpha意味着完全不透明/完全透明,因此你可以选择添加一个TRNS块来声明一种特殊的颜色,因为它是完全透明的(正如在其他答案中指出的那样,这将禁止使用那种颜色)