Bitmap 8, 16 bits, а также mono -> 24 color
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 возращала правильно заполненную структуру.
а как определить RGB16bits записан в формате 5,6,5 или 5,5,5 ?
Заботай bmp-формат, если не лень. Смысл вообщем то такой: bmp фаил содержит <заголовок>+<палитра>+<точки по порядку: номер цвета из палитры >. 16бит указывает на величину палитры (65535 цветов)
Так что, говорить о 5,5,5 или 5,6,5 совсем неверно
Чтоб мне съесть свою голову, если это не так
заголовок
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)
так мне интересно, как из имаджхедера понять, что используется в данный момент?
зы
Готовую либу совсем не с руки взять?
для 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.
Там есть такая штука в хедере, как CLRUSED и CLRIMPORTANT
можно их заботать
но google.com
выдает, например, такие исходники:
http://www.devolution.com/pipermail/sdl-cvs/2004-August/000625.html
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;
Ну в жопу это программирование
google может всякую хуйню выводить, а msdn.Microsoft.com про 15 bits не слышал..
Дык, может это стандарт де-факто, а не де-юре.
если на майкрософте написано, что может быть только 16, а про 15 ничего нет, это не мой стандарт...
де-юре - это означает, что в стандарте написано, что бывает такое и такое
де-факто, это означает, что в мире крутится значительное кол-во картинок, которые оформлены именно по этим правилам.
Только после 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 версии формата это фактически так уже прописано.
Ты сам-то много с такими форматами работал?
Де-юре всегда будет bibitcount 16, см. новые стандарты.
А де-факто дофигищи картинок именно с bibitcount 16 и далее соответственно с масками для задания формата битов. (И будет еще больше, подобные форматы в мобильниках и кпк, коих с каждым днем больше и больше). И Photoshop, начиная с 7 версии, поддерживает не то, что ты процитировал, а именно 16 бит + маски (Photoshop 6 понимал только 565 режим).
Просто картинку, где 15 записано в biBitCount, ни одна из известных и популярных прог не откроет.
respect, не знал
Давно, и в детстве - сейчас стараюсь для стандартных задач использовать стандартные либы.
> Де-юре всегда будет bibitcount 16, см. новые стандарты.
где смотреть?
> Просто картинку, где 15 записано в biBitCount, ни одна из известных и популярных прог не откроет.
Viewer-ы обычно открывают.
Оставить комментарий
lord2476
Думаю эти алгоритмы, функции давно написаны, но никак не могу найтиМожет кто уже сталкивался? знает, подскажет...