Конвертирование Bmp из 32 бит в 8 бит на С++
От: black_engel  
Дата: 25.11.09 14:42
Оценка:
Здравствуйте!

Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл

(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)

25.11.09 18:51: Перенесено модератором из 'C/C++' — Кодт
Re: Конвертирование Bmp из 32 бит в 8 бит на С++
От: Чили Россия  
Дата: 26.11.09 06:06
Оценка:
Здравствуйте, black_engel, Вы писали:

_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл


Используй SetDIBits()
lpbmi.bmiHeader.biBitCount = 8;
Re: Конвертирование Bmp из 32 бит в 8 бит на С++
От: CEMb  
Дата: 26.11.09 07:32
Оценка:
Здравствуйте, black_engel, Вы писали:

_>Здравствуйте!


_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл


_>(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)


А разве в BMP индексы используются? По-моему, нет, там просто цвета.

Вот, а по теории, 32-битная картинка делается так: куски по 4 байта, A B G R. Берём цепочку и разбираем по 4(3) байта: надо B G R превратить в 2битовые цвета (сдвигом на 6 бит вправо, или разделить на 64) и сложить из них байт. Про А тут ничё не знаю, наскоко оно в 8-битных битмапах поддерживается
Re: Конвертирование Bmp из 32 бит в 8 бит на С++
От: MBo  
Дата: 26.11.09 09:08
Оценка:
Здравствуйте, black_engel, Вы писали:

_>Здравствуйте!


_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл


_>(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)


В 32-битном битмапе палитры нет, а вот в 8-битном она нужна.
Если использовать палитру по умолчанию, то достаточно создать битмап нужной цветовой глубины, выбрать его в memory context, и сделать BitBlt.
Однако качество обычно будет отвратным. В общем случае для каждой картинки нужно создавать оптимизированную под нее палитру. См., например, книгу Фень Юаня.
Re[2]: Конвертирование Bmp из 32 бит в 8 бит на С++
От: Чили Россия  
Дата: 26.11.09 10:28
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>А разве в BMP индексы используются? По-моему, нет, там просто цвета.


Если в BITMAP'е используется 1, 4 или 8 бит для записи пиксела, то пишется не цвет, а индекс в палитре цветов !!!
Re[2]: Конвертирование Bmp из 32 бит в 8 бит на С++
От: Чили Россия  
Дата: 26.11.09 10:35
Оценка:
Здравствуйте, MBo, Вы писали:

MBo>В 32-битном битмапе палитры нет, а вот в 8-битном она нужна.

MBo>Если использовать палитру по умолчанию, то достаточно создать битмап нужной цветовой глубины, выбрать его в memory context, и сделать BitBlt.
MBo>Однако качество обычно будет отвратным. В общем случае для каждой картинки нужно создавать оптимизированную под нее палитру. См., например, книгу Фень Юаня.

Если установлено 32-битное разрешение, то любая функция, которая создет битмап, создаст битмап с 32-битным разрешением, несмотря на значение bmBitsPixel (BITMAP). Это проверено!
Re: Конвертирование Bmp из 32 бит в 8 бит на С++
От: dcb-BanDos Россия  
Дата: 26.11.09 10:50
Оценка:
Здравствуйте, black_engel, Вы писали:

_>Здравствуйте!


_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл


_>(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)


смотреть здесь
В демо есть на тулбаре Decrease bpp/Increase bpp
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[3]: Конвертирование Bmp из 32 бит в 8 бит на С++
От: MBo  
Дата: 26.11.09 12:41
Оценка:
Здравствуйте, Чили, Вы писали:

Ч>Если установлено 32-битное разрешение, то любая функция, которая создет битмап, создаст битмап с 32-битным разрешением, несмотря на значение bmBitsPixel (BITMAP). Это проверено!


Может быть, как-то не так проверяли?
Вот, например, код с использованием простейшей CreateBitmap (на Дельфи, но от сишного принципиально отличаться не будет) выводит размер строки битмапа в байтах = 16, как и должно быть для 8-битного


var
  DC: HDC;
  bm: HBITMAP;
  arr: array[0..255] of Byte;
  bmpbuf: Windows.BITMAP;
begin
  DC := CreateCompatibleDC(0);
  ZeroMemory(@arr, SizeOf(arr));
  bm := CreateBitmap(16, 16, 1, 8, @arr);
  SelectObject(dc, bm);
  GetObject(bm, SizeOf(bmpbuf), @bmpbuf);
  Caption := IntToStr(bmpbuf.bmWidthBytes);
Re: Конвертирование Bmp из 32 бит в 8 бит на С++
От: algol Россия about:blank
Дата: 26.11.09 13:30
Оценка:
Здравствуйте, black_engel, Вы писали:

_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл

_>(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)

Можно собрать из двух примеров в MSDN:
1. Bit2Mono.exe Changes Color Bitmaps to Monochrome — преобразует битмап в одноцветную палитру, можно переделать на 8-битную.
2. Wicked Code — создание оптимизированной палитры из 24-бит битмапа. Исходники можно скачать здесь.
Еще можно погуглить по "Color Quantization".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.