win32 - Как сделать снимок экрана как 8-битное или 16-битное растровое изображение? - PullRequest
1 голос
/ 18 мая 2010

Я только начинаю с программирования Win32 GDI и нахожу хорошие ссылки, которые трудно найти. У меня есть простое приложение, которое захватывает экран, выполнив следующие действия:

</p> <pre><code>UINT32 x,y; x = GetSystemMetrics(SM_CXSCREEN); y = GetSystemMetrics(SM_CYSCREEN); HDC hdc = GetDC(NULL); HDC hdcScreen = CreateCompatibleDC(hdc); HBITMAP hbmp = CreateCompatibleBitmap(hdc, x, y); SelectObject(hdcScreen, hbmp); BitBlt(hdcScreen, 0, 0, x, y, hdc, 0, 0, SRCCOPY) ReleaseDC(NULL, hdc);

Я записываю совместимое растровое изображение, которое на моем компьютере является 32-разрядным. Используя те же / похожие вызовы, как бы я захватил экран в 8-битном? А как насчет 16-битного?

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

Используйте CreateDIBSection для создания растрового изображения 8bpp и BitBlt для этого.


Заполнение структуры BITMAPINFO будет интересным. Вы не можете использовать обычную структуру BITMAPINFO, так как она выделяет место только для одной записи палитры, а с изображением 8bpp - вам понадобятся полные 256 записей.

Если вы хотите немного обмануть, можно использовать анонимный союз, чтобы объявить BITMAPINFO с достаточным пространством для его палитры.

union
{
  BITMAPINFO bmi;
  struct {
    BITMAPINFOHEADER bmih;
    RGBQUAD extra[256];
  } dummy;
};

bmi.bmiHeader.biSize = sizeof (bmi.bmiHeader);
bmi.biBitCount = 8;
// and so on.

Что касается значений для инициализации в таблице цветов ... Я не могу придумать простой способ получить палитру 8bpp по умолчанию из GDI, когда она не в режиме 8bpp. У меня есть подозрение, что CreateHalftonePalette ничего не сделает на устройстве без палитры.

1 голос
/ 18 мая 2010

Я почти уверен, что вам придется захватить 32-битное растровое изображение, а затем преобразовать его в 8-битное самостоятельно. 8-битное преобразование обычно теряет изрядное количество данных, и существует довольно много разных алгоритмов, как это сделать. Если у вас действительно нет выбора нет , я бы вообще пересмотрел это. Это было долго время, так как у большинства людей было много причин возиться с 8-битными растровыми изображениями - и они беспорядок.

8-битное растровое изображение (по крайней мере, типичное) имеет «палитру», которая задает 24-битные значения каждого из (до) 256 цветов, которые будут использоваться в файле растрового изображения. Как правило, вы хотите выбрать цвета, которые наиболее близки к цветам в исходном растровом изображении. Для этого было изобретено лотов алгоритмов. Поиск в поисках чего-то вроде «алгоритма уменьшения цвета» должен дать довольно много хитов, с несколькими вариантами того, как это сделать, компромисс между скоростью выполнения, использованием памяти и т. Д. Я даже не могу догадаться, какой из них лучше всего подойдет к вашей конкретной цели.

Как я уже сказал заранее, моя первая склонность будет заключаться в том, чтобы потратить некоторое время и усилия на простое устранение этого требования. Сокращение с 32 до 24 или даже 16 бит довольно легко, и сохраняет лот исходного качества. Переход к 8 битам значительно сложнее , а теряет много качества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...