Как получить 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 при попытке скопировать пиксели в кадр.

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

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

Войти через центр авторизации
Похожие вопросы