Bitmap 8, 16 bits, а также mono -> 24 color

lord2476

Думаю эти алгоритмы, функции давно написаны, но никак не могу найти
Может кто уже сталкивался? знает, подскажет...

yolki

никак. У меня были написаны две функции:
RGB BMP::GetPixel(int x,int y)
и
void BMP::PutPixel(int x,int y,RGB c);
void BMP::PutPixelP(int x,int y,int c); // палитровый
RGB={unsigned char r,g,b;}
соотв. GetPixel возращала правильно заполненную структуру.

lord2476

понятно.
а как определить RGB16bits записан в формате 5,6,5 или 5,5,5 ?

0000

>RGB16bits записан в формате 5,6,5 или 5,5,5
Заботай bmp-формат, если не лень. Смысл вообщем то такой: bmp фаил содержит <заголовок>+<палитра>+<точки по порядку: номер цвета из палитры >. 16бит указывает на величину палитры (65535 цветов)
Так что, говорить о 5,5,5 или 5,6,5 совсем неверно
Чтоб мне съесть свою голову, если это не так

lord2476

съешь
заголовок
 	TRACE("FileHeader.bfType : %d\n",FileHeader.bfType);
TRACE("FileHeader.bfSize : %d\n",FileHeader.bfSize);
TRACE("FileHeader.bfReserved1 : %d\n",FileHeader.bfReserved1);
TRACE("FileHeader.bfReserved2 : %d\n",FileHeader.bfReserved2);
TRACE("FileHeader.bfOffBits : %d\n",FileHeader.bfOffBits);
 	TRACE("IMAGE HEADER :\n");
TRACE("biSize : %d\n",m_Header.biSize);
TRACE("biWidth : %d\n",m_Header.biWidth);
TRACE("biHeight : %d\n",m_Header.biHeight);
TRACE("biPlanes : %d\n",m_Header.biPlanes);
TRACE("biBitCount : %d\n",m_Header.biBitCount);
TRACE("biCompression : %d\n",m_Header.biCompression);
TRACE("biSizeImage : %d\n",m_Header.biSizeImage);
TRACE("biXPelsPerMeter : %d\n",m_Header.biXPelsPerMeter);
TRACE("biYPelsPerMeter : %d\n",m_Header.biYPelsPerMeter);
TRACE("biClrUsed : %d\n",m_Header.biClrUsed);
TRACE("biClrImportant : %d\n",m_Header.biClrImportant);

biBitCount означает количество бит выделенных на цвет одного пикселя
16 = 5+5+5+1 = 5+6+5 (r+g+b)
так мне интересно, как из имаджхедера понять, что используется в данный момент?

Dasar

Обычно в bitCount написано, или 15 (для 5+5+5 или 16 (5+6+5)
зы
Готовую либу совсем не с руки взять?

lord2476

нет, значения бывают только 0,1,4,8,16,24,32
для 16
The bitmap has a maximum of 2^16 colors. If the biCompression member of the BITMAPINFOHEADER is BI_RGB, the bmiColors member of BITMAPINFO is NULL. Each WORD in the bitmap array represents a single pixel. The relative intensities of red, green, and blue are represented with five bits for each color component. The value for blue is in the least significant five bits, followed by five bits each for green and red. The most significant bit is not used. The bmiColors color table is used for optimizing colors used on palette-based devices, and must contain the number of entries specified by the biClrUsed member of the BITMAPINFOHEADER.
If the biCompression member of the BITMAPINFOHEADER is BI_BITFIELDS, the bmiColors member contains three DWORD color masks that specify the red, green, and blue components, respectively, of each pixel. Each WORD in the bitmap array represents a single pixel.
Windows NT/Windows 2000/XP: When the biCompression member is BI_BITFIELDS, bits set in each DWORD mask must be contiguous and should not overlap the bits of another mask. All the bits in the pixel do not have to be used.
Windows 95/98/Me: When the biCompression member is BI_BITFIELDS, the system supports only the following 16bpp color masks: A 5-5-5 16-bit image, where the blue mask is 0x001F, the green mask is 0x03E0, and the red mask is 0x7C00; and a 5-6-5 16-bit image, where the blue mask is 0x001F, the green mask is 0x07E0, and the red mask is 0xF800.

yolki

555 - это 15bpp
Там есть такая штука в хедере, как CLRUSED и CLRIMPORTANT
можно их заботать

Dasar

хз
но google.com
выдает, например, такие исходники:

switch(m_obh.biBitCount)
{
case 15:
param.output_format=DEC_RGB555_INV;
break;
case 16:
param.output_format=DEC_RGB565_INV;
break;
case 24:
param.output_format=DEC_RGB24_INV;
break;
case 32:
param.output_format=DEC_RGB32_INV;
break;
http://www.devolution.com/pipermail/sdl-cvs/2004-August/000625.html

0000

Мда, сорри, совсем все забыл
Ну в жопу это программирование

lord2476

google может всякую хуйню выводить, а msdn.Microsoft.com про 15 bits не слышал..

Dasar

Дык, может это стандарт де-факто, а не де-юре.

lord2476

что значит "де-юре"?
если на майкрософте написано, что может быть только 16, а про 15 ничего нет, это не мой стандарт...

Dasar

> что значит "де-юре"?
де-юре - это означает, что в стандарте написано, что бывает такое и такое
де-факто, это означает, что в мире крутится значительное кол-во картинок, которые оформлены именно по этим правилам.

DiDiPi

biCount будет равен 16.
Только после InfoHeader будет еще 16 байт для указания маски (к слову, 16бит это не обязательно 555 или 565, бывает и 444x) (соответственно, bitmapOffset будет уже на 16 больше)
Таким образом, получаем
BITMAPFILEHEADER
BITMAPINFOHEADER
и далее
16 байт
redMask 0xF8000000
greenBask 0x07E00000;
blueMask 0x001F0000;
alphaMask 0x00000000
Для других 16-битных пикселей маски соответсвенно будут свои.
Кстати, с bitCount == 15 многие популярные программы не откроют файл. Photoshop 7 и 8, умеющий поддерживать различные режимы для 16битного цвета, также пишет 16 в bitCount
Если интересуют стандарты, на bmp format их несколько - в 3 и 4 версии формата это фактически так уже прописано.

DiDiPi

Google часто дает ссылки на неточную инфу, и что?
Ты сам-то много с такими форматами работал?
Де-юре всегда будет bibitcount 16, см. новые стандарты.
А де-факто дофигищи картинок именно с bibitcount 16 и далее соответственно с масками для задания формата битов. (И будет еще больше, подобные форматы в мобильниках и кпк, коих с каждым днем больше и больше). И Photoshop, начиная с 7 версии, поддерживает не то, что ты процитировал, а именно 16 бит + маски (Photoshop 6 понимал только 565 режим).
Просто картинку, где 15 записано в biBitCount, ни одна из известных и популярных прог не откроет.

Dasar

> Только после InfoHeader будет еще 16 байт для указания маски
respect, не знал

Dasar

> Ты сам-то много с такими форматами работал?
Давно, и в детстве - сейчас стараюсь для стандартных задач использовать стандартные либы.
> Де-юре всегда будет bibitcount 16, см. новые стандарты.
где смотреть?
> Просто картинку, где 15 записано в biBitCount, ни одна из известных и популярных прог не откроет.
Viewer-ы обычно открывают.
Оставить комментарий
Имя или ник:
Комментарий: