Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл
(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)
25.11.09 18:51: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, black_engel, Вы писали:
_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл
Здравствуйте, black_engel, Вы писали:
_>Здравствуйте!
_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл
_>(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)
А разве в BMP индексы используются? По-моему, нет, там просто цвета.
Вот, а по теории, 32-битная картинка делается так: куски по 4 байта, A B G R. Берём цепочку и разбираем по 4(3) байта: надо B G R превратить в 2битовые цвета (сдвигом на 6 бит вправо, или разделить на 64) и сложить из них байт. Про А тут ничё не знаю, наскоко оно в 8-битных битмапах поддерживается
Здравствуйте, black_engel, Вы писали:
_>Здравствуйте!
_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл
_>(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)
В 32-битном битмапе палитры нет, а вот в 8-битном она нужна.
Если использовать палитру по умолчанию, то достаточно создать битмап нужной цветовой глубины, выбрать его в memory context, и сделать BitBlt.
Однако качество обычно будет отвратным. В общем случае для каждой картинки нужно создавать оптимизированную под нее палитру. См., например, книгу Фень Юаня.
Re[2]: Конвертирование Bmp из 32 бит в 8 бит на С++
Здравствуйте, MBo, Вы писали:
MBo>В 32-битном битмапе палитры нет, а вот в 8-битном она нужна. MBo>Если использовать палитру по умолчанию, то достаточно создать битмап нужной цветовой глубины, выбрать его в memory context, и сделать BitBlt. MBo>Однако качество обычно будет отвратным. В общем случае для каждой картинки нужно создавать оптимизированную под нее палитру. См., например, книгу Фень Юаня.
Если установлено 32-битное разрешение, то любая функция, которая создет битмап, создаст битмап с 32-битным разрешением, несмотря на значение bmBitsPixel (BITMAP). Это проверено!
Здравствуйте, black_engel, Вы писали:
_>Здравствуйте!
_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл
_>(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)
смотреть здесь
В демо есть на тулбаре Decrease bpp/Increase bpp
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[3]: Конвертирование Bmp из 32 бит в 8 бит на С++
Здравствуйте, Чили, Вы писали:
Ч>Если установлено 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);
Здравствуйте, black_engel, Вы писали:
_>Подскажите (приведите здесь примеры кода) пожалуйста как можно из 32-битной бмпшки получить 8-битовую (как получить цветовую таблицу и как получить индексы цветов), для дальнейшего сохранения ее в файл _>(ответы для решения этого вопроса нужны на С++, можно использовать только GDI или WinAPI, но никаких MFC, С#, GDI+ и т.п.)
Можно собрать из двух примеров в MSDN:
1. Bit2Mono.exe Changes Color Bitmaps to Monochrome — преобразует битмап в одноцветную палитру, можно переделать на 8-битную.
2. Wicked Code — создание оптимизированной палитры из 24-бит битмапа. Исходники можно скачать здесь.
Еще можно погуглить по "Color Quantization".