Как получить screenshot в нужном цветовом формате?

Здравствуйте.
Я работаю над программой, которая захватывает кадры с области экрана и формирует из них GIF анимацию. Вот примерный код:
hdcScreen = GetDC(hDesktopWnd);
hdcMemDC = CreateCompatibleDC(hdcScreen);
hbmScreen = CreateCompatibleBitmap(hdcScreen, width, height);
BitBlt( hdcMemDC, 0, 0, width,height, hdcScreen, x, y, SRCCOPY);
GetDIBits(hdcMemDC, hbmScreen, 0,
		(UINT) height, lpbitmap,
		(BITMAPINFO *)&bmpInfo, DIB_RGB_COLORS);
// на данном этапе в lpbitmap хранятся пиксели в RGB формате
// далее пиксели используются для генерации кадра GIF

Проблема в том, что скрины я могу получать в формате 32/24/16 битов на пиксель в виде цвета RGB. В то же время GIF хранит пиксели в виде индексов цветов из палитры. И мне желательно бы получать screenshot сразу в виде палитры и индексов, чтобы не выполнять лишних преобразований. Итак, вопрос: как получить скрин сразу с палитрой? Или как получить палитру?

P.S.: пробовал получать палитру с помощью GetSystemPaletteEntries, но почему то функция возвращает 0 (т.е. не работает). Палитра то ли заполнена мусором, то ли состоит только из 5 цветов.

P.P.S: Как я получал скрины с разной глубиной? Я просто ставил флаг:
bmpInfo.biBitCount = 32; // Works fine.Each pixel is 32 bit
bmpInfo.biBitCount = 24; // Works fine.Each pixel is 24 bit
bmpInfo.biBitCount = 16; // Works fine.Each pixel is 16 bit
bmpInfo.biBitCount = 8; // Causes Access violation

и получал массив lpbitmap в нужном формате. Если же поставить это флажок на 8, то массив lpbitmap видимо ничем не заполняется, т.к. я ловлю access violation при попытке скопировать пиксели в кадр.

Заранее все спасибо за ответы, любые помощь и советы приветствуются!
  • Вопрос задан
  • 2243 просмотра
Пригласить эксперта
Ответы на вопрос 1
lek
@lek
Создавайте не compatible bitmap, а DIB-секцию с нужным вам форматом (CreateDIBSection). ฺBitBlt умеет перекодировать, если source-dest форматы разные. Придется немного раздобраться во внутренностях битмапов, но там нет ничего особо сложного.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы