在 C Win32 中使用 hBitmap = CreateDIBSection() 保存 .bmp 文件 [英] Saving .bmp file using hBitmap = CreateDIBSection() in C Win32

查看:61
本文介绍了在 C Win32 中使用 hBitmap = CreateDIBSection() 保存 .bmp 文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码.我想使用此信息创建一个 .bmp 文件,该文件显示内存中的数据,这是从帧抓取器复制到主内存中的图像,有人可以让我吗?谢谢

I have the following code. I want to use this information to create one .bmp file that shows the data from memory which is a image copied from a framegrabber into main memory, can somebody please let me? Thank you

LPSTR CreateBMP( HWND hAppWnd, int nImageType )

{
无效* pWinGBits = NULL;诠释我;Z_BITMAPINFO zWinGHeader;//用于创建 DIB 的位图信息

{
void * pWinGBits = NULL; int i; Z_BITMAPINFO zWinGHeader; // bitmapinfo for cerating the DIB

//  create DC for bitmap.
hDCBits = CreateCompatibleDC( ghDCMain );

switch ( nImageType )
{
    case bayer_filter:
    zWinGHeader.bmiHeader.biSize            = sizeof( BITMAPINFOHEADER );
    zWinGHeader.bmiHeader.biPlanes          = 1;
    zWinGHeader.bmiHeader.biClrImportant    = 0;
    zWinGHeader.bmiHeader.biHeight          = -lYSize;
    zWinGHeader.bmiHeader.biWidth           = lXSize;
    zWinGHeader.bmiHeader.biBitCount        = 32;
    zWinGHeader.bmiHeader.biClrUsed         = 0;//3;
    zWinGHeader.bmiHeader.biCompression     = BI_BITFIELDS;
    zWinGHeader.bmiHeader.biSizeImage       = 0;
    zWinGHeader.bmiColors[0].rgbBlue        = 0x00;
    zWinGHeader.bmiColors[0].rgbGreen       = 0x00;
    zWinGHeader.bmiColors[0].rgbRed         = 0xFF;
    zWinGHeader.bmiColors[0].rgbReserved    = 0x00;

    zWinGHeader.bmiColors[1].rgbBlue        = 0x00;
    zWinGHeader.bmiColors[1].rgbGreen       = 0xFF;
    zWinGHeader.bmiColors[1].rgbRed         = 0x00;
    zWinGHeader.bmiColors[1].rgbReserved    = 0x00;

    zWinGHeader.bmiColors[2].rgbBlue        = 0xFF;
    zWinGHeader.bmiColors[2].rgbGreen       = 0x00;
    zWinGHeader.bmiColors[2].rgbRed         = 0x00;
    zWinGHeader.bmiColors[2].rgbReserved    = 0x00;
    break;

    case color32:
    zWinGHeader.bmiHeader.biSize            = sizeof( BITMAPINFOHEADER );
    zWinGHeader.bmiHeader.biPlanes          = 1;
    zWinGHeader.bmiHeader.biClrImportant    = 0;
    zWinGHeader.bmiHeader.biHeight          = -lYSize;
    zWinGHeader.bmiHeader.biWidth           = lXSize/4;
    zWinGHeader.bmiHeader.biBitCount        = 32;
    zWinGHeader.bmiHeader.biClrUsed         = 0;
    zWinGHeader.bmiHeader.biCompression     = BI_BITFIELDS;
    zWinGHeader.bmiHeader.biSizeImage       = 0;
    zWinGHeader.bmiColors[0].rgbBlue        = 0x00;
    zWinGHeader.bmiColors[0].rgbGreen       = 0x00;
    zWinGHeader.bmiColors[0].rgbRed         = 0xFF;
    zWinGHeader.bmiColors[0].rgbReserved    = 0x00;

    zWinGHeader.bmiColors[1].rgbBlue        = 0x00;
    zWinGHeader.bmiColors[1].rgbGreen       = 0xFF;
    zWinGHeader.bmiColors[1].rgbRed         = 0x00;
    zWinGHeader.bmiColors[1].rgbReserved    = 0x00;

    zWinGHeader.bmiColors[2].rgbBlue        = 0xFF;
    zWinGHeader.bmiColors[2].rgbGreen       = 0x00;
    zWinGHeader.bmiColors[2].rgbRed         = 0x00;
    zWinGHeader.bmiColors[2].rgbReserved    = 0x00;
    break;

    case color24:
    zWinGHeader.bmiHeader.biSize            = sizeof( BITMAPINFOHEADER );
    zWinGHeader.bmiHeader.biPlanes          = 1;
    zWinGHeader.bmiHeader.biClrImportant    = 0;
    zWinGHeader.bmiHeader.biHeight          = -lYSize;
    zWinGHeader.bmiHeader.biWidth           = lXSize/3;
    zWinGHeader.bmiHeader.biBitCount        = 24;
    zWinGHeader.bmiHeader.biClrUsed         = 0;
    zWinGHeader.bmiHeader.biCompression     = BI_RGB;
    zWinGHeader.bmiHeader.biSizeImage       = 0;
    break;

    case color3x16:
    zWinGHeader.bmiHeader.biSize            = sizeof( BITMAPINFOHEADER );
    zWinGHeader.bmiHeader.biPlanes          = 1;
    zWinGHeader.bmiHeader.biClrImportant    = 0;
    zWinGHeader.bmiHeader.biHeight          = -lYSize;
    zWinGHeader.bmiHeader.biWidth           = lXSize/6;
    zWinGHeader.bmiHeader.biBitCount        = 32;
    zWinGHeader.bmiHeader.biClrUsed         = 0;
    zWinGHeader.bmiHeader.biCompression     = BI_BITFIELDS;
    zWinGHeader.bmiHeader.biSizeImage       = 0;
    zWinGHeader.bmiColors[0].rgbBlue        = 0x00;
    zWinGHeader.bmiColors[0].rgbGreen       = 0x00;
    zWinGHeader.bmiColors[0].rgbRed         = 0xFF;
    zWinGHeader.bmiColors[0].rgbReserved    = 0x00;

    zWinGHeader.bmiColors[1].rgbBlue        = 0x00;
    zWinGHeader.bmiColors[1].rgbGreen       = 0xFF;
    zWinGHeader.bmiColors[1].rgbRed         = 0x00;
    zWinGHeader.bmiColors[1].rgbReserved    = 0x00;

    zWinGHeader.bmiColors[2].rgbBlue        = 0xFF;
    zWinGHeader.bmiColors[2].rgbGreen       = 0x00;
    zWinGHeader.bmiColors[2].rgbRed         = 0x00;
    zWinGHeader.bmiColors[2].rgbReserved    = 0x00;
    break;

    case bw1x10:
    //  create bitmap-infoheader.
    zWinGHeader.bmiHeader.biSize        = sizeof( BITMAPINFOHEADER );
    zWinGHeader.bmiHeader.biPlanes      = 1;
    zWinGHeader.bmiHeader.biBitCount    = 8;
    zWinGHeader.bmiHeader.biCompression = BI_RGB;
    zWinGHeader.bmiHeader.biSizeImage   = 0;
    zWinGHeader.bmiHeader.biClrUsed     = 256;
    zWinGHeader.bmiHeader.biClrImportant= 0;
    zWinGHeader.bmiHeader.biHeight      = -lYSize;
    zWinGHeader.bmiHeader.biWidth       = lXSize/2;

    //  create colortable fot bitmap (grayvalues).
    for (i = 0; i < 256; i++) 
    {
        zWinGHeader.bmiColors[i].rgbGreen   = i;
        zWinGHeader.bmiColors[i].rgbBlue    = i;
        zWinGHeader.bmiColors[i].rgbRed     = i;

        zWinGHeader.bmiColors[i].rgbReserved = 0;
    }
    break;

    default:
    case bw8:
    //  create bitmap-infoheader.
    zWinGHeader.bmiHeader.biSize        = sizeof( BITMAPINFOHEADER );
    zWinGHeader.bmiHeader.biPlanes      = 1;
    zWinGHeader.bmiHeader.biBitCount    = 8;
    zWinGHeader.bmiHeader.biCompression = BI_RGB;
    zWinGHeader.bmiHeader.biSizeImage   = 0;
    zWinGHeader.bmiHeader.biClrUsed     = 256;
    zWinGHeader.bmiHeader.biClrImportant= 0;
    zWinGHeader.bmiHeader.biHeight      = -lYSize;
    zWinGHeader.bmiHeader.biWidth       = lXSize;

    //  create colortable fot bitmap (grayvalues).
    for (i = 0; i < 256; i++) 
    {
        zWinGHeader.bmiColors[i].rgbGreen   = i;
        zWinGHeader.bmiColors[i].rgbBlue    = i;
        zWinGHeader.bmiColors[i].rgbRed     = i;

        zWinGHeader.bmiColors[i].rgbReserved = 0;
    }
    break;
}

//  cerate identity palette 
hPal = CreateIdentityPalette( zWinGHeader.bmiColors );

//  get new palette into DC and map into physical palette register.
hOldPal = SelectPalette( ghDCMain, hPal, FALSE);
RealizePalette( ghDCMain );

//  cerate DIB-Section f黵 direct access of image-data.
hBitmap = CreateDIBSection(
    hDCBits,                        //  handle of device context
    (BITMAPINFO *)&zWinGHeader,     //  address of structure containing
                                    //  bitmap size, format and color data
    DIB_RGB_COLORS,                 //  color data type indicator: RGB values
                                    //  or palette indices
    &pWinGBits,                     //  pointer to variable to receive a pointer
                                    //  to the bitmap's bit values
    NULL,                           //  optional handle to a file mapping object
    0                               //  offset to the bitmap bit values within
                                    //  the file mapping object
);  
//  get bitmap into DC .
hOldBitmap = (HBITMAP)SelectObject( hDCBits, hBitmap );
return pWinGBits;           //  return pointer to DIB 

}

推荐答案

使用 win32 api 从内存中的图像数据或 HBITMAP 到图像文件的最简单方法是使用 GDI+.只需从您的图像数据或 HBITMAP 创建一个位图对象(请参阅 http://msdn.microsoft.com/en-us/library/ms536314%28v=vs.85%29.aspx),然后使用 Save 方法创建文件(参见 http://msdn.microsoft.com/en-us/library/ms535407%28v=vs.85%29.aspx).如果您不能使用 C++,这些方法也作为可从 C 调用的函数存在.

The easiest way to go from image data in memory or an HBITMAP to an image file using the win32 api is with GDI+. Just create a Bitmap object from your image data or HBITMAP (see http://msdn.microsoft.com/en-us/library/ms536314%28v=vs.85%29.aspx), then use the Save method to create the file (see http://msdn.microsoft.com/en-us/library/ms535407%28v=vs.85%29.aspx). If you're not able to use C++, those methods also exist as functions callable from C.

这篇关于在 C Win32 中使用 hBitmap = CreateDIBSection() 保存 .bmp 文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆