如何节省24位BMP

时间:2013-06-17 12:27:34

标签: c++ bitmap screen-capture

我有一个捕获屏幕并将其保存到位图(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 个答案:

答案 0 :(得分:0)

研究图像的32位和24位呈现。每个图像文件都有两个部分标题和数据。在普通图像中,最多固定大小的字节包含标题(通常为1024byte)。然后数据开始。如果图像大小为WxH,那么您将获得WxHx32字节数据。每个32位包含一个像素信息,因此您将获得R,G,B和alpha信息(4x8)。你用24格式写它只有RGB数据。这就是你所需要的。我没有找到任何功能构建。