我正在尝试在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)
的结果。
我的问题是:
PixelFormatCanonical: Is in canonical format
?以下是使用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
。
答案 0 :(得分:2)
在尝试了GDI + Image类的所有可能功能之后,我认为找到了解决方案。需要从图像中检索flags并针对ImageFlagsColorSpaceGRAY
进行测试对于Grayscale PNG:
PixelFormat32bppARGB
ImageFlagsColorSpaceGRAY
已设置(ImageFlagsColorSpaceRGB
未已设置)对于RGB PNG:
PixelFormat24bppRGB
ImageFlagsColorSpaceRGB
已设置(ImageFlagsColorSpaceGRAY
未已设置)对于RGBA PNG:
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位格式,以便进行处理,显示和保存。