GDI +:作为PixelFormat32bppARGB加载的灰度PNG

时间:2015-05-22 08:27:16

标签: c++ windows gdi+

我正在尝试在Windows 7 / 64bits Pro上使用GDI +加载灰度PNG文件。但是,如果我使用Image::GetPixelFormat()返回的值,它会告诉我pixelFormat是PixelFormat32bppARGB

如果我将此PNG转换为JPG和/或TIFF,它现在告诉我pixelFormat现在是PixelFormat8bppIndexed

查看those值here的定义,并不多见。无论如何看here,都会发现PixelFormat32bppARGB实际上是(10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical)的结果。

我的问题是:

  1. 以下内容是什么意思:PixelFormatCanonical: Is in canonical format
  2. 据我所知,GDI +可以自由地将单组件灰度图像表示为32bpp ARGB,非预乘alpha,但是如何检查基础表示实际上是灰度?这将证明是有用的,因为我只想从ARGB缓冲区复制单个组件。
  3. 以下是使用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

2 个答案:

答案 0 :(得分:2)

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

进行测试

对于Grayscale PNG:

  • PixelFormat是:PixelFormat32bppARGB
  • ImageFlagsColorSpaceGRAY已设置(ImageFlagsColorSpaceRGB 已设置)

对于RGB PNG:

  • PixelFormat是:PixelFormat24bppRGB
  • ImageFlagsColorSpaceRGB已设置(ImageFlagsColorSpaceGRAY 已设置)

对于RGBA PNG:

  • PixelFormat是:PixelFormat32bppARGB
  • ImageFlagsColorSpaceRGB已设置(ImageFlagsColorSpaceGRAY 已设置)

答案 1 :(得分:0)

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

2:Image :: GetPixelFormat告诉你Image对象的像素格式,它不必与PNG文件相同。

在页面底部describing the pixel formats,有一条评论:

  

PixelFormat48bppRGB,PixelFormat64bppARGB和PixelFormat64bppPARGB每个颜色分量(通道)使用16位。 Windows GDI + 1.0版可以读取每通道16位的图像,但是这些图像被转换为​​每通道8位格式,以便进行处理,显示和保存。