| Новости | |||||
|---|---|---|---|---|---|
|
| Техника | |
|---|---|
|
| Программирование | |||
|---|---|---|---|
|
| Дополнительно | ||
|---|---|---|
|
| Опросы |
|---|
| Реклама |
|---|
|
|
| Партнеры |
|---|
| Фотмат BMP ( Часть 2 ) |
| Автор Albinos_X | ||
| 12.05.2007 г. | ||
Эта статья про то, что собой представляет графический формат BMP. Хоть это и один из простых форматов, но из-за того, что существует много вариаций этого формата, то не все моменты очевидны.В Windows 3.x и старше на замену TBitmapCoreInfo приходит структура TBitMapInfo описанная следующим образом TBitMapInfo = packed record bmiHeader : TBitmapInfoHeader; bmiColors : array[0..0] of TRGBQuad; end; Как вы, вероятно, заметили, на смену TBitmapCoreHeader пришел TBitmapInfoHeader, или его совместимые расширенные версии TBitmapV4Header и TBitmapV5Header. TBitmapInfoHeader = packed record biSize : DWORD; biWidth : Longint; biHeight : Longint; biplanes : Word; biBitCount : Word; biCompression : DWORD; biSizeImage : DWORD; biXPelsPerMeter : Longint; biYPelsPerMeter : Longint; biClrUsed : DWORD; biClrImportant : DWORD; end; //--вспомогательная структура TCIEXYZTriple = packed record ciexyzRed : TCIEXYZ; ciexyzGreen : TCIEXYZ; ciexyzBlue : TCIEXYZ; end; TBitmapV4Header = packed record bV4Size : DWORD; bV4Width : Longint; bV4Height : Longint; bV4Planes : Word; bV4BitCount : Word; bV4V4Compression : DWORD; bV4SizeImage : DWORD; bV4XPelsPerMeter : Longint; bV4YPelsPerMeter : Longint; bV4ClrUsed : DWORD; bV4ClrImportant : DWORD; bV4RedMask : DWORD; bV4GreenMask : DWORD; bV4BlueMask : DWORD; bV4AlphaMask : DWORD; bV4CSType : DWORD; bV4Endpoints : TCIEXYZTriple; bV4GammaRed : DWORD; bV4GammaGreen : DWORD; bV4GammaBlue : DWORD; end; TBitmapV5Header = packed record bV5Size : DWORD; bV5Width : Longint; bV5Height : Longint; bV5Planes : Word; bV5BitCount : Word; bV5Compression : DWORD; bV5SizeImage : DWORD; bV5XPelsPerMeter : Longint; bV5YPelsPerMeter : Longint; bV5ClrUsed : DWORD; bV5ClrImportant : DWORD; bV5RedMask : DWORD; bV5GreenMask : DWORD; bV5BlueMask : DWORD; bV5AlphaMask : DWORD; bV5CSType : DWORD; bV5Endpoints : TCIEXYZTriple; bV5GammaRed : DWORD; bV5GammaGreen : DWORD; bV5GammaBlue : DWORD; bV5Intent : DWORD; bV5ProfileData : DWORD; bV5ProfileSize : DWORD; bV5Reserved : DWORD; end; Цветовая палитра (если имеется) состоит из четырех полей, причем ее структура не зависит от разрядности цвета. TRGBQuad = packed record rgbBlue : Byte; rgbGreen : Byte; rgbRed : Byte; rgbReserved : Byte; end; Теперь рассмотрим все новые поля (тех, что не было в TBitmapCoreHeader) по очереди. biCompression – тип сжатия. О сжатии уже упоминал ранее, теперь рассмотрим его более подробно. Как вы знаете сжатие позволяет уменьшить размер изображения. Однако формат bmp создавался как несжатый и до сих пор сжатие в bmp встречается крайне редко. Здесь возможны 6 вариантов: Const BI_RGB = $00000000; BI_RLE8 = $00000001; BI_RLE4 = $00000002; BI_BITFIELDS = $00000003; BI_JPEG = $00000004; BI_PNG = $00000005; Из них BI_RGB и BI_BITFIELDS являются несжатыми. Вопрос сжатых битмапов слишком сложный чтоб рассмотреть его в рамках этой статьи, поэтому подробно рассмотрен не будет. Ручная распаковка таких форматов сложна, и мало полезна, поскольку Windows берет на себя эту задачу. Форматы сжатия BI_RLE8, BI_RLE4, BI_BITFIELDS были введены в Windows начиная с 3 версии и были дополнены BI_JPEG и BI_PNG в Windows 98/Me, Windows 2000/XP. Форматы BI_RLE8, BI_RLE4 используются для сжатия только 8-ми и 4-х бит на пиксель изображений соответственно. Формат BI_BITFIELDS – представляет собой беспалитровый формат цвета. В нем цвета задаются при помощи 3-х четырех битовых масок, идущих сразу после структуры (по маске на каждый цвет). Примеры таких масок приведены уже были в описании цвета 16 бит на пиксель. Для 32 бита на пиксель маски для синего, зеленого и красного цветов имеют вид $000000FFh, $0000FF00h, $00FF0000h соответственно. Как же можно выделить цвет при помощи такой маски, да легко! Например, пусть нужно выделить зеленый цвет из двойного слова 32 бит на пиксель. G := (Data and $0000FF00h) shr 8; или в общем B := (Data and BlueMask) shr (0 * biBitCount); G := (Data and GreenMask) shr (1 * biBitCount); R := (Data and RedMask) shr (2 * biBitCount); Такой формат можно использовать только для разрядности цвета 16 и 32 бита на пиксель. Данные представлены не индексами в палитре, а значениями цвета. Формат BI_RGB также является несжатым. Отличие от BI_BITFIELDS, состоит в том, что он поддерживает изображения с разрядностью цвета biBitCount от 1 до 32 бит на пиксель, при этом битмапы с biBitCount от 1 до 8 обязаны содержать палитру, а значения цветовых данных определяют индекс цвета в палитре, битмапы с biBitCount от 16 до 32 как правило не содержат палитры (но формат допускает присутствие палитры и в этом случае), значения цветовых данных определяют цвет пикселя (даже при наличии палитры). Подробнее см. biClrUsed. biSizeImage обозначает размер картинки в байтах. Если изображение несжатое (то есть предыдущее поле установлено в BI_RGB), то это значение не используется – рекомендовано устанавливать в ноль (но другие значения не запрещены). Для сжатых изображений (biCompression имеет значение BI_JPEG или BI_PNG) - biSizeImage определяет размер буфера данных (блока данных). biXPelsPerMeter и biYPelsPerMeter обозначают соответственно горизонтальное и вертикальное разрешение (в пикселях на метр) рекомендуемое для установки в конечном устройстве, на которое будет выводиться битовый массив. Приложение может использовать это значение для того, чтобы выбирать из группы ресурсов наиболее подходящий битовый массив для нужного устройства. Напомню, что формат bmp - это по сути аппаратно-независимый растр, то есть универсальный для всех устройств, отличительной особенностью которого является то, что картинка будет выглядеть одинаково вне зависимости от того, рисуется она на экране монитора или печатается на принтере. Но вот разрешение у устройств разное, и именно для того, чтобы выбрать наиболее подходящую картинку из имеющихся и используют эти параметры. biClrUsed определяет количество используемых цветов из таблицы. Если это значение равно нулю, то либо в растре используется максимально возможное количество цветов, которые разрешены значением biBitCount, либо изображение сжато. Если biClrUsed не нуль, а biBitCount меньше 16, то biClrUsed определяет текущее число цветов палитры. Если biBitCount больше или равно 16 (количество цветов более 256), то biClrUsed определяет размер таблицы цветов, используемой для оптимизации текущей системной палитры. Такая таблица цветов, как уже упоминалось, присутствует достаточно редко, но может привести к появлению ошибок при чтении цветового массива, если программа не использует значение bfOffBits для определения начала битового массива, а вместо этого интерпретирует байты, следующие непосредственно за TBitmapInfoHeader (или ее расширенного варианта), как начало растра. biClrImportant - это количество важных для изображения цветов. Если это значение равно 0 (как это обычно и бывает), то все цвета считаются важными. Это поле было введено поддержки устройств с малым количеством цветов. Например, если на устройстве, поддерживающем только 256 цветов, отображаются более одного изображения с числом цветов 256 с разными палитрами, то естественно, что для правильного отображения суммарной картинки потребуется общая палитра с числом цветов превышающим 256. В этом случае в общую палитру вводят вначале важные цвета (в палитре они должны идти первыми) по возможности всех изображений, затем вносят другие. Если нужного цвета в палитре не окажется, то он будет заменен, на наиболее близкий. На этом описание основных полей TBitmapInfoHeader закончено, дальше пойдет описание расширенных полей (TBitmapV4Header, TBitmapV5Header), т.е. не обязательных для чтения. Эта информация нигде, кроме как в MSDN, не дается. Автор: Alexeis (С) ( http://forum.vingrad.ru/index.php?showuser=777&nickname=Alexeis )
Функция доступна только зарегистрированным пользователям. Powered by AkoComment 2.0! |
||

Эта статья про то, что собой представляет графический формат BMP. Хоть это и один из простых форматов, но из-за того, что существует много вариаций этого формата, то не все моменты очевидны.