и сдвигать цветовые компоненты пикселей,
дется маскировать и сдвигать цветовые компоненты пикселей, чтобы обеспечить их соответствие формату DIB-секции.
Полагаю, я достаточно подготовил вас. Ниже приведена функция, которая получает изображение из буфера:
// Получить текущее изображение из буфера.
// Если функция возвращает информационный заголовок
// или графические данные, вызывающая функция должна
// освобождать соответствующую память вызовами delete pBMI
// и ::DeleteObject(hBmp). Не пытайтесь применять delete
// к графическим данным, поскольку они принадлежат
// объекту-растру.
HBITMAP CDirectDraw::GrabImage(BITMAPINFO** ppBMI,
void** ppBits) {
// Задать исходные значения, возвращаемые функцией
if (ppBMI) *ppBMI= NULL;
if (ppBits) *ppBits = NULL;
if (!m_pBackBuffer) return NULL;
// Заблокировать вторичный буфер, чтобы получить
// его описание.
// ВНИМАНИЕ: вы не сможете осуществить пошаговое
// выполнение
// этого фрагмента в отладчике — поверхность GDI
// блокируется.
LPDIRECTDRAWSURFACE iS = m_pBackBuffer-»GetInterface () ;
ASSERT;iS) ;
DDSURFACEDESC ds;
ds.dwSize = sizeof(ds);
m_hr = i3-»Lock(NULL,
&ds,
DDLOCK_WAIT,
NULL) ;
if (m_hr != DD_OK) {
TRACE("Failed to lock surface\n");
return NULL; // Failed to lock surface }
// Разблокировать поверхность, чтобы можно было // воспользоваться отладчиком //и при необходимости выйти из приложения m_hr = m_pBackBuffer-»GetInterface()-»Unlock(ds.lpSurface) ;
// Убедиться, что поверхность относится к одному
// из типов,
// с которыми мы можем работать.
// Примечание: программа обрабатывает только
/b> ЯИЦ1 Глава 11. Клипы
// поверхности с 8-,
// 16- и 24-битной кодировкой пикселей.
if (!(ds.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) && '(ds.ddpfPixelFormat.dwFlags & DDPF_RGB)) { return NULL; // Формат не поддерживается программой
} int iBitCount;
if (ds.ddpfPixelFormat.dwFiags & DDPF_PALETTEINDEXED8) {
iBitCount = 8;
} else if (ds.ddpfPixelFormat.dwFlags & DDPF_RGB) {
// Проверить поверхность на допустимость типа
Содержание Назад Вперед