Как сохранить 24-битный BMP

У меня есть функция, чтобы захватить экран и сохранить его в растровом (32-битном). Эта функция прекрасно работает, но мне также нужно 24-битное растровое изображение.
Я понятия не имею, как преобразовать эту функцию.

        HWND okno=GetDesktopWindow();
HDC _dc = GetWindowDC(okno);
RECT re;
GetWindowRect( okno, & re );
unsigned int w = re.right, h = re.bottom;

HDC dc = CreateCompatibleDC( 0 );
HBITMAP bm = CreateCompatibleBitmap( _dc, w, h );
SelectObject( dc, bm );
StretchBlt( dc, 0, 0, w, h, _dc, 0, 0, w, h, SRCCOPY );

void * file = CreateFile(file_name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 ); //create file
void * buf = new char[ w * h * 3 ]; //buffor

GetObject( bm, 84, buf );
HDC ddd = GetDC( 0 );
HDC dc2 = CreateCompatibleDC( ddd );

tagBITMAPINFO bit_info; //bitmapinfo
bit_info.bmiHeader.biSize = sizeof( bit_info.bmiHeader );
bit_info.bmiHeader.biWidth = w;
bit_info.bmiHeader.biHeight = h;
bit_info.bmiHeader.biPlanes = 1;
bit_info.bmiHeader.biBitCount = 32;
bit_info.bmiHeader.biCompression = 0;
bit_info.bmiHeader.biSizeImage = 0;
CreateDIBSection( dc, & bit_info, DIB_RGB_COLORS, & buf, 0, 0 );
GetDIBits( dc, bm, 0, h, buf, & bit_info, DIB_RGB_COLORS );

BITMAPFILEHEADER bit_header;
bit_header.bfType = MAKEWORD( 'B', 'M' );
bit_header.bfSize = w * h * 4 + 54;
bit_header.bfOffBits = 54;

BITMAPINFOHEADER bit_info_header;
bit_info_header.biSize = 40;
bit_info_header.biWidth = w;
bit_info_header.biHeight = h;
bit_info_header.biPlanes = 0;
bit_info_header.biBitCount = 32;
bit_info_header.biCompression = 0;
bit_info_header.biSizeImage = w * h *4;

DWORD r;
WriteFile( file, & bit_header, sizeof( bit_header ), & r, NULL );
WriteFile( file, & bit_info_header, sizeof( bit_info_header ), & r, NULL );
WriteFile( file, buf, w * h * 4, & r, NULL );

Извините за мой английский 🙂

1

Решение

Изучите 32-битное и 24-битное представление изображений. Каждый файл изображения состоит из двух частей заголовка и данных. В обычных изображениях до фиксированного размера байтов содержит заголовок (обычно 1024 байта). Затем данные начинаются. Если размер изображения — WxH, вы получите байтовые данные WxHx32. Каждый 32-битный бит содержит информацию об одном пикселе, поэтому вы получите R, G, B и альфа-информацию (4×8). Вы пишете это в 24 формате только с данными RGB. Это все, что вам нужно. Я не нашел никакой встроенной функции для этого.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]