Имя поля «bV4V4Compression» с удвоенным «V4» указано в документациях и объявлении структуры в файле WinGDI.h (смотрите, например, «BITMAPV4HEADER structureАрхивная копия от 11 октября 2013 на Wayback Machine» на MSDN.).
В MSDN в самом начале раздела «Remarks» страницы структуры BITMAPV5HEADERАрхивная копия от 11 октября 2013 на Wayback Machine есть предложение «If bV5Height is negative, indicating a top-down DIB, bV5Compression must be either BI_RGB or BI_BITFIELDS.» (перевод: «Если bV5Height отрицательный, обозначая DIB вида „сверху вниз“, то bV5Compression должен быть либо BI_RGB, либо BI_BITFIELDS»). Здесь возможно не уточнили, что это касается только RLE-кодирования, так как в одном из примеров прорисовки JPEG-растра указывается именно отрицательная высота (ищите строку «bmi.bmiHeader.biHeight» в статье «Testing a Printer for JPEG or PNG SupportАрхивная копия от 14 ноября 2013 на Wayback Machine» на MSDN).
Будьте внимательны.
В MSDN в статье «BITMAPINFOHEADERАрхивная копия от 19 апреля 2014 на Wayback Machine»
для Windows Mobile 6.5 в описании к полю biClrUsed есть предложение
«If biBitCount equals 16 or 32, the optimal color palette starts immediately following the three DWORD masks.»
(перевод: «Если biBitCount равно 16 или 32, то оптимальная цветовая палитра начинается следуя сразу за тремя DWORD-масками»).
В этой же статье выше, в описании к полю biCompression сказано «Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks…»
и ниже аналогичное с «consists of four DWORD color masks» (переводы: «Указывает, что битмап не сжат и что таблица цветов состоит из трёх цветовых DWORD-масок»
и «состоит из четырёх цветовых DWORD-масок»).
Аналогичная информация содержится в статье «BITMAPINFOHEADER structureАрхивная копия от 9 февраля 2014 на Wayback Machine» для Windows 9x/NT.
Всё это можно интерпретировать так, что в битности 16 и 32 за информационными полями (структурой BITMAPINFOHEADER) обязательно присутствуют три 32-битных маски для извлечения значений цветовых каналов.
При этом если Compression содержит 3 (BI_BITFIELDS) или 6 (BI_ALPHABITFIELDS), то за ними добавляется ещё три или четыре аналогичных маски,
которые в свою очередь занимают таблицу цветов делая невозможным использование 16-битных индексов оптимальных цветов в логической палитре
(возможно при этом в поле biClrUsed нужно записать значение 6 или 8, а в biClrImportant обязательно 0, чтобы дополнительные маски случайно не обработались как индексы в палитре).
В действительности всё несколько иначе.
В документации MSDN на странице «Bitmap Header TypesАрхивная копия от 22 сентября 2014 на Wayback Machine» есть предложение
«Bitmaps that are 1, 4, or 8 bpp must have a color table with a maximum size based on the bpp.»
(перевод: «Битмапы с битностью 1, 4 или 8 должны содержать таблицу цветов с максимальным соответствующим битности размером.»).
Это явно ошибка и писавший применил условия структуры CORE, у которой действительно должен быть максимум
(см. раздел «Remarks» в статье «BITMAPCOREINFO structureАрхивная копия от 3 мая 2015 на Wayback Machine»),
ко всем остальным версиям структур.
В другой статье «BITMAPINFO structureАрхивная копия от 24 июня 2014 на Wayback Machine» про таблицу цветов сказано
«The number of entries in the array depends on the values of the biBitCount and biClrUsed members of the BITMAPINFOHEADER structure.»
(перевод: «количество элементов в массиве зависит от значений полей biBitCount и biClrUsed структуры BITMAPINFOHEADER»),
а в статьях структур версий 3, 4, 5
(см., например, «BITMAPV5HEADER structureАрхивная копия от 11 октября 2013 на Wayback Machine»)
в описании поля BitCount везде написано
«the bmiColors member of BITMAPINFO contains up to 256 entries»
(аналогично про другие битности; перевод фразы: «член bmiColors BITMAPINFO содержит до 256 элементов»).
На MSDN и справке Microsoft Windows SDK в статье «BITMAPINFOHEADER structureАрхивная копия от 9 февраля 2014 на Wayback Machine» в описании значения 16 поля biBitCount есть сбивающее с толку предложение «All the bits in the pixel do not have to be used.» (перевод: «Не задействовать все биты в пикселе»). Это опечатка (написали «have» вместо «need»), которая отсутствует в аналогичном блоке в статье про пятую версиюАрхивная копия от 11 октября 2013 на Wayback Machine (в четвёртой это предложение отсутствует).
В документации (например, в статье «BITMAPV5HEADER structureАрхивная копия от 11 октября 2013 на Wayback Machine» на MSDN) сказано, что нулевой размер можно указывать при значении 0 (BI_RGB) поля Compression. Очевидно, что это применимо и к значениям 3 (BI_BITFIELDS) и 6 (BI_ALPHABITFIELDS), так как они вносят различие лишь во внутреннюю структуру пикселей, а не в их размер.
Имя поля «bV4V4Compression» с удвоенным «V4» указано в документациях и объявлении структуры в файле WinGDI.h (смотрите, например, «BITMAPV4HEADER structureАрхивная копия от 11 октября 2013 на Wayback Machine» на MSDN.).
В MSDN в самом начале раздела «Remarks» страницы структуры BITMAPV5HEADERАрхивная копия от 11 октября 2013 на Wayback Machine есть предложение «If bV5Height is negative, indicating a top-down DIB, bV5Compression must be either BI_RGB or BI_BITFIELDS.» (перевод: «Если bV5Height отрицательный, обозначая DIB вида „сверху вниз“, то bV5Compression должен быть либо BI_RGB, либо BI_BITFIELDS»). Здесь возможно не уточнили, что это касается только RLE-кодирования, так как в одном из примеров прорисовки JPEG-растра указывается именно отрицательная высота (ищите строку «bmi.bmiHeader.biHeight» в статье «Testing a Printer for JPEG or PNG SupportАрхивная копия от 14 ноября 2013 на Wayback Machine» на MSDN).
Будьте внимательны.
В MSDN в статье «BITMAPINFOHEADERАрхивная копия от 19 апреля 2014 на Wayback Machine»
для Windows Mobile 6.5 в описании к полю biClrUsed есть предложение
«If biBitCount equals 16 or 32, the optimal color palette starts immediately following the three DWORD masks.»
(перевод: «Если biBitCount равно 16 или 32, то оптимальная цветовая палитра начинается следуя сразу за тремя DWORD-масками»).
В этой же статье выше, в описании к полю biCompression сказано «Specifies that the bitmap is not compressed and that the color table consists of three DWORD color masks…»
и ниже аналогичное с «consists of four DWORD color masks» (переводы: «Указывает, что битмап не сжат и что таблица цветов состоит из трёх цветовых DWORD-масок»
и «состоит из четырёх цветовых DWORD-масок»).
Аналогичная информация содержится в статье «BITMAPINFOHEADER structureАрхивная копия от 9 февраля 2014 на Wayback Machine» для Windows 9x/NT.
Всё это можно интерпретировать так, что в битности 16 и 32 за информационными полями (структурой BITMAPINFOHEADER) обязательно присутствуют три 32-битных маски для извлечения значений цветовых каналов.
При этом если Compression содержит 3 (BI_BITFIELDS) или 6 (BI_ALPHABITFIELDS), то за ними добавляется ещё три или четыре аналогичных маски,
которые в свою очередь занимают таблицу цветов делая невозможным использование 16-битных индексов оптимальных цветов в логической палитре
(возможно при этом в поле biClrUsed нужно записать значение 6 или 8, а в biClrImportant обязательно 0, чтобы дополнительные маски случайно не обработались как индексы в палитре).
В действительности всё несколько иначе.
В документации MSDN на странице «Bitmap Header TypesАрхивная копия от 22 сентября 2014 на Wayback Machine» есть предложение
«Bitmaps that are 1, 4, or 8 bpp must have a color table with a maximum size based on the bpp.»
(перевод: «Битмапы с битностью 1, 4 или 8 должны содержать таблицу цветов с максимальным соответствующим битности размером.»).
Это явно ошибка и писавший применил условия структуры CORE, у которой действительно должен быть максимум
(см. раздел «Remarks» в статье «BITMAPCOREINFO structureАрхивная копия от 3 мая 2015 на Wayback Machine»),
ко всем остальным версиям структур.
В другой статье «BITMAPINFO structureАрхивная копия от 24 июня 2014 на Wayback Machine» про таблицу цветов сказано
«The number of entries in the array depends on the values of the biBitCount and biClrUsed members of the BITMAPINFOHEADER structure.»
(перевод: «количество элементов в массиве зависит от значений полей biBitCount и biClrUsed структуры BITMAPINFOHEADER»),
а в статьях структур версий 3, 4, 5
(см., например, «BITMAPV5HEADER structureАрхивная копия от 11 октября 2013 на Wayback Machine»)
в описании поля BitCount везде написано
«the bmiColors member of BITMAPINFO contains up to 256 entries»
(аналогично про другие битности; перевод фразы: «член bmiColors BITMAPINFO содержит до 256 элементов»).
На MSDN и справке Microsoft Windows SDK в статье «BITMAPINFOHEADER structureАрхивная копия от 9 февраля 2014 на Wayback Machine» в описании значения 16 поля biBitCount есть сбивающее с толку предложение «All the bits in the pixel do not have to be used.» (перевод: «Не задействовать все биты в пикселе»). Это опечатка (написали «have» вместо «need»), которая отсутствует в аналогичном блоке в статье про пятую версиюАрхивная копия от 11 октября 2013 на Wayback Machine (в четвёртой это предложение отсутствует).
В документации (например, в статье «BITMAPV5HEADER structureАрхивная копия от 11 октября 2013 на Wayback Machine» на MSDN) сказано, что нулевой размер можно указывать при значении 0 (BI_RGB) поля Compression. Очевидно, что это применимо и к значениям 3 (BI_BITFIELDS) и 6 (BI_ALPHABITFIELDS), так как они вносят различие лишь во внутреннюю структуру пикселей, а не в их размер.