GDI+: 以PixelFormat32bppARGB格式加载的灰度PNG

4
我正在尝试在Windows 7/64位专业版上使用GDI+加载灰度PNG文件。然而,如果我使用Image::GetPixelFormat()返回的值,它告诉我像素格式为PixelFormat32bppARGB
如果我将此PNG转换为JPG和/或TIFF,则现在它告诉我像素格式现在是PixelFormat8bppIndexed
查看这些值的定义here并没有提供太多信息。然而,查看它们here,揭示了PixelFormat32bppARGB实际上是(10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical)的结果。
我的问题是:
  1. 以下内容是什么意思:PixelFormatCanonical: Is in canonical format
  2. 我知道GDI+可以将单个组件的灰度图像表示为32bpp ARGB,非预乘alpha,但是我如何检查底层表示实际上是灰度的?这将证明很有用,因为我只想从ARGB缓冲区复制一个组件。

以下是使用UNIX shell中的pnginfo命令从PNG文件获取的一些信息:

$ pnginfo input.png
input.png...
  Image Width: 2492 Image Length: 3508
  Bitdepth (Bits/Sample): 8
  Channels (Samples/Pixel): 1
  Pixel depth (Pixel Depth): 8
  Colour Type (Photometric Interpretation): GRAYSCALE 
  Image filter: Single row per byte filter 
  Interlacing: No interlacing 
  Compression Scheme: Deflate method 8, 32k window
  Resolution: 11811, 11811 (pixels per meter)
  FillOrder: msb-to-lsb
  Byte Order: Network (Big Endian)
  Number of text strings: 0 of 0

这甚至是与wine实现GDI+相关的问题。当前wine 1.6.2也认为我的输入PNG实际上是:PixelFormat8bppIndexed

4
你假设 GetPixelFormat() 会告诉你一些关于文件格式的信息是错误的。它只会告诉你图像编解码器为位图数据选择了哪种内存中的表示方式。这永远不会是灰度格式之一,因为它与你的硬件不兼容。 - Hans Passant
2个回答

3

在尝试了GDI+ Image类的所有可能函数后,我认为找到了解决方案。需要从图像中检索flags并针对ImageFlagsColorSpaceGRAY进行测试。

对于灰度PNG:

  • 像素格式是:PixelFormat32bppARGB
  • ImageFlagsColorSpaceGRAY已设置(ImageFlagsColorSpaceRGB未设置)

对于RGB PNG:

  • 像素格式是:PixelFormat24bppRGB
  • ImageFlagsColorSpaceRGB已设置(ImageFlagsColorSpaceGRAY未设置)

对于RGBA PNG:

  • 像素格式为:PixelFormat32bppARGB
  • ImageFlagsColorSpaceRGB已设置(ImageFlagsColorSpaceGRAY未设置)

0

1:你链接的标志页面是来自Windows CE的页面,你确认你的Windows SDK中的标志实际上是相同的吗?

2:Image::GetPixelFormat告诉您Image对象的像素格式,这不一定与PNG文件相同。

描述像素格式页面的底部有一个备注:

PixelFormat48bppRGB、PixelFormat64bppARGB和PixelFormat64bppPARGB使用每个颜色分量(通道)16位。 Windows GDI+版本1.0可以读取16位每通道图像,但此类图像会转换为8位每通道格式进行处理、显示和保存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接