2015-05-22 3 views
3

Я пытаюсь загрузить черно-белый PNG-файл с использованием GDI + в Windows 7/64bits Pro. Однако, если я использую значение, возвращаемое с Image::GetPixelFormat(), он сообщает мне, что pixelFormat равен PixelFormat32bppARGB.GDI +: черно-белая PNG загружается как PixelFormat32bppARGB

Если я конвертирую этот PNG в JPG и/или TIFF, теперь он говорит мне, что pixelFormat теперь PixelFormat8bppIndexed.

Глядя на определение значений thoses here, не говорит много. Однако, глядя на них here, показано, что PixelFormat32bppARGB фактически является результатом (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical).

Мои вопросы:

  1. Что делает следующие средства: PixelFormatCanonical: Is in canonical format?
  2. Я понимаю, что GDI + может представлять собой однокомпонентное изображение в градациях серого как 32bpp ARGB, без предварительной мультиплексированной альфы, но как я могу проверить, что базовое представление на самом деле является полутоновой? Это будет полезно, поскольку я хочу только скопировать один компонент из буфера ARGB.

Вот некоторая информация из файла PNG с помощью команды pnginfo из оболочки UNIX:

$ 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 +. Current wine 1.6.2 тоже думаю мой ввод PNG действительно: PixelFormat8bppIndexed.

+4

Ваше предположение, что GetPixelFormat() сообщает вам что-либо о формате файла, просто неверно. Он сообщает вам, какой именно кодек изображения выбрал для представления данных растровых изображений в памяти. Это никогда не будет одним из оттенков серого, оно несовместимо с вашим оборудованием. –

ответ

2

После попытки всех возможных функций из класса GDI + Image, я думаю, нашел решение.Одним нужно получить flags от изображения и испытания против ImageFlagsColorSpaceGRAY

Для Grayscale PNG:

  • PixelFormat является: PixelFormat32bppARGB
  • ImageFlagsColorSpaceGRAY установлен (ImageFlagsColorSpaceRGB является не комплект)

Для RGB PNG:

  • PixelFormat является: PixelFormat24bppRGB
  • ImageFlagsColorSpaceRGB устанавливается (ImageFlagsColorSpaceGRAY является не комплект)

Для RGBA PNG:

  • PixelFormat является: PixelFormat32bppARGB
  • ImageFlagsColorSpaceRGB устанавливается (ImageFlagsColorSpaceGRAY является нет комплект)
0

1: Страница, которую вы связали для флагов, представляет собой страницу из Windows CE, вы подтвердили, что флаги в Windows SDK на самом деле одинаковы?

2: Изображение :: GetPixelFormat сообщает вам пиксельный формат объекта Image, который не обязательно должен быть таким же, как PNG-файл.

В нижней части страницы describing the pixel formats имеется замечание:

PixelFormat48bppRGB, PixelFormat64bppARGB и PixelFormat64bppPARGB использовать 16 бит на компоненту цвета (канала). Windows GDI + версия 1.0 может читать 16-битные изображения на канал, но такие изображения преобразуются в формат 8 бит на канал для обработки, отображения и сохранения.

Смежные вопросы