2014-01-17 3 views
0

Учитывая HDC, я хотел бы выяснить не только, сколько бит красного, зеленого, синего и альфа есть (используя DescribePixelFormat), но даже их макет (BGR (A) или RGB (A)), чтобы я мог выполнять манипуляции с уровнем пикселей и цветом.Как получить формат pixelformat с помощью Windows API

Должен ли я всегда считать, что они находятся в BGR (A)? Это разумное предположение?

+0

На машинах с маленькими концами, я думаю, что это всегда BGRA, тогда как большой endian всегда ARBG iirc. Не уверен, но я знаю, что это соглашение для OpenGL, и многие api используют Windows. Также быстрее использовать BGRA на окнах. По этой причине, я считаю, что все на самом деле BGRA на окнах (на 5% быстрее). – Brandon

ответ

1

http://msdn.microsoft.com/en-us/library/dd183449(VS.85).aspx

Это документацию для COLORREF, который хранится в 0x00BBGGRR.

В соответствии с тем, что используется большинством WINAPI, я должен был предположить, что все в Windows фактически хранится в формате BGRA .. AFAIK, DIBs находятся в формате BGRA.

Вы можете попробовать нарисовать красное окно. Создайте раздел DIB и скопируйте пиксели в буфер. Если первый байт равен 0xFF, это RGBA, иначе это BGRA.

Изображения GDI32 всегда хранятся как BGRA на моей машине. Изображения GDI24 всегда BGR. Я выпустил API обработки изображений и всех пользователей, я не встречал ни одного, у которого не было такого же формата. Я еще не видел формат backbuffer DC или default в RGBA вместо BGRA.

В чем причина, по которой вам действительно нужно знать формат DC? Я так и не узнал.

При чтении изображения вы вычисляете количество бит из поля BitmapInfoHeader.biBitCount.

+0

Мне нужен формат DC, чтобы преобразовать бит растрового изображения, захваченного с этого DC в YUV. Я использую GetDIBBits, но я видел, как он возвращает меня BGRA или BGR на разных машинах. На данный момент я проверяю количество бит в R, G и B, используя результат DescribePixelFormat и предполагаю только макет BGR (A). Я беспокоюсь, что это может быть не все на разных машинах. В отсутствие функций для получения необходимой информации я искал документально подтвержденную уверенность в том, что этого не будет, я думаю. Пользуясь опытом в библиотеке, я приму этот ответ. Благодаря! – Ani

0

Согласно документации для PIXELFORMATDESCRIPTOR:

iPixelType Определяет тип данных пикселя. Определены следующие типы: PFD_TYPE_RGBA пиксели RGBA. Каждый пиксель имеет четыре компонента в этом порядке: красный, зеленый, синий и альфа. PFD_TYPE_COLORINDEX Цветные пиксели. Каждый пиксель использует значение индекса цвета.

Похоже, что они либо RGBA, либо индексированы.

+0

Извините, но нет. Все флаги говорят, что если pixelformat проиндексирован или нет. Пиксели могут быть физически BGR или BGRA, или RGB или RGBA. Я видел, что этот флаг говорит мне, что они RGBA, но они на самом деле расположены BGRA. – Ani

+0

Ну, документы говорят «в этом порядке», так что, возможно, это вопрос конца? Или, может быть, документы просто ошибаются? Есть ли другие значения, которые вы видели в поле «iPixelType»? – user1118321

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