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

LibPNG: smallest way to store 9-bit grayscale images

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

  1. 16 位灰度
  2. 带 alpha 的 8 位 GrayScale,第 9 位存储为 alpha
  3. 还有其他建议吗?

此外,从文档来看,它看起来是 8 位的 GRAY_ALPHA,alpha 也是 8 位的。是否可以只用一位 alpha 得到 8 位灰度?

如果所有 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 文件实际上小于 "optimized" 8 位灰度 +tRNS

Which one produces the smallest 9-bit depth grayscale images using LibPNG?

16 bit Grayscale

8 bit GrayScale with alpha, having the 9th bit stored as alpha

两种格式的字节原始布局非常相似:G2-G1 G2-G1 ...在一种情况下(每个 16 位值的最高有效字节 first),G-A G-A ...在另一个。因为 filtering/prediction 是在字节级别完成的,这意味着两个备选方案之间几乎没有差异。因为 16 位灰度在您的场景中更自然,所以我会选择它。 如果您走另一条路,我建议您尝试将最高有效位或最低有效位放在 alpha 通道上。

Also, from documentation it looks like in 8bit GRAY_ALPHA, alpha is 8 bit as well. Is it possible to have 8 bits of gray with only one bit of alpha

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