Здравствуйте.
Я работаю над программой, которая захватывает кадры с области экрана и формирует из них 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 при попытке скопировать пиксели в кадр.
Заранее все спасибо за ответы, любые помощь и советы приветствуются!