在C Win32中使用hBitmap=CreateDIBSection()保存.bmp文件

在C Win32中使用hBitmap=CreateDIBSection()保存.bmp文件,c,file,winapi,save,bmp,C,File,Winapi,Save,Bmp,我有以下代码。我想用这些信息创建一个.bmp文件,显示内存中的数据,内存是从framegrabber复制到主内存的图像,有人能告诉我吗? 多谢各位 LPSTR CreateBMP( HWND hAppWnd, int nImageType ) { void*pWinGBits=NULL; int i; Z_BITMAPINFO zWinGHeader;//用于切割DIB的BITMAPINFO // create DC for bitmap. hDCBits = CreateCompatibl

我有以下代码。我想用这些信息创建一个.bmp文件,显示内存中的数据,内存是从framegrabber复制到主内存的图像,有人能告诉我吗? 多谢各位

LPSTR CreateBMP( HWND hAppWnd, int nImageType )
{
void*pWinGBits=NULL; int i; Z_BITMAPINFO zWinGHeader;//用于切割DIB的BITMAPINFO

//  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 
//为位图创建DC。
hDCBits=CreateCompatibleDC(ghDCMain);
开关(nImageType)
{
案例拜耳过滤器:
zWinGHeader.bmiHeader.biSize=sizeof(BitMapInfo头文件);
zWinGHeader.bmiHeader.biPlanes=1;
zWinGHeader.bmiHeader.biClrImportant=0;
zWinGHeader.bmiHeader.biHeight=-lYSize;
zWinGHeader.bmiHeader.biWidth=lXSize;
zWinGHeader.bmiHeader.bibibitCount=32;
zWinGHeader.bmiHeader.biclrued=0;//3;
zWinGHeader.bmiHeader.biCompression=BI_位字段;
zWinGHeader.bmiHeader.biSizeImage=0;
zWinGHeader.bmiColors[0].rgbBlue=0x00;
zWinGHeader.bmiColors[0].rgbGreen=0x00;
zWinGHeader.bmiColors[0].rgbreed=0xFF;
zWinGHeader.bmiColors[0].rgbReserved=0x00;
zWinGHeader.bmiColors[1].rgbBlue=0x00;
zWinGHeader.bmiColors[1].rgbGreen=0xFF;
zWinGHeader.bmiColors[1].rgred=0x00;
zWinGHeader.bmiColors[1].rgbReserved=0x00;
zWinGHeader.bmiColors[2].rgbBlue=0xFF;
zWinGHeader.bmiColors[2].rgbGreen=0x00;
zWinGHeader.bmiColors[2].rgred=0x00;
zWinGHeader.bmiColors[2].rgbReserved=0x00;
打破
外壳颜色32:
zWinGHeader.bmiHeader.biSize=sizeof(BitMapInfo头文件);
zWinGHeader.bmiHeader.biPlanes=1;
zWinGHeader.bmiHeader.biClrImportant=0;
zWinGHeader.bmiHeader.biHeight=-lYSize;
zWinGHeader.bmiHeader.biWidth=lXSize/4;
zWinGHeader.bmiHeader.bibibitCount=32;
zWinGHeader.bmiHeader.biclrued=0;
zWinGHeader.bmiHeader.biCompression=BI_位字段;
zWinGHeader.bmiHeader.biSizeImage=0;
zWinGHeader.bmiColors[0].rgbBlue=0x00;
zWinGHeader.bmiColors[0].rgbGreen=0x00;
zWinGHeader.bmiColors[0].rgbreed=0xFF;
zWinGHeader.bmiColors[0].rgbReserved=0x00;
zWinGHeader.bmiColors[1].rgbBlue=0x00;
zWinGHeader.bmiColors[1].rgbGreen=0xFF;
zWinGHeader.bmiColors[1].rgred=0x00;
zWinGHeader.bmiColors[1].rgbReserved=0x00;
zWinGHeader.bmiColors[2].rgbBlue=0xFF;
zWinGHeader.bmiColors[2].rgbGreen=0x00;
zWinGHeader.bmiColors[2].rgred=0x00;
zWinGHeader.bmiColors[2].rgbReserved=0x00;
打破
外壳颜色24:
zWinGHeader.bmiHeader.biSize=sizeof(BitMapInfo头文件);
zWinGHeader.bmiHeader.biPlanes=1;
zWinGHeader.bmiHeader.biClrImportant=0;
zWinGHeader.bmiHeader.biHeight=-lYSize;
zWinGHeader.bmiHeader.biWidth=lXSize/3;
zWinGHeader.bmiHeader.bibibitCount=24;
zWinGHeader.bmiHeader.biclrued=0;
zWinGHeader.bmiHeader.biCompression=BI_RGB;
zWinGHeader.bmiHeader.biSizeImage=0;
打破
外壳颜色3x16:
zWinGHeader.bmiHeader.biSize=sizeof(BitMapInfo头文件);
zWinGHeader.bmiHeader.biPlanes=1;
zWinGHeader.bmiHeader.biClrImportant=0;
zWinGHeader.bmiHeader.biHeight=-lYSize;
zWinGHeader.bmiHeader.biWidth=lXSize/6;
zWinGHeader.bmiHeader.bibibitCount=32;
zWinGHeader.bmiHeader.biclrued=0;
zWinGHeader.bmiHeader.biCompression=BI_位字段;
zWinGHeader.bmiHeader.biSizeImage=0;
zWinGHeader.bmiColors[0].rgbBlue=0x00;
zWinGHeader.bmiColors[0].rgbGreen=0x00;
zWinGHeader.bmiColors[0].rgbreed=0xFF;
zWinGHeader.bmiColors[0].rgbReserved=0x00;
zWinGHeader.bmiColors[1].rgbBlue=0x00;
zWinGHeader.bmiColors[1].rgbGreen=0xFF;
zWinGHeader.bmiColors[1].rgred=0x00;
zWinGHeader.bmiColors[1].rgbReserved=0x00;
zWinGHeader.bmiColors[2].rgbBlue=0xFF;
zWinGHeader.bmiColors[2].rgbGreen=0x00;
zWinGHeader.bmiColors[2].rgred=0x00;
zWinGHeader.bmiColors[2].rgbReserved=0x00;
打破
案例bw1x10:
//创建位图信息头。
zWinGHeader.bmiHeader.biSize=sizeof(BitMapInfo头文件);
zWinGHeader.bmiHeader.biPlanes=1;
zWinGHeader.bmiHeader.bibibitCount=8;
zWinGHeader.bmiHeader.biCompression=BI_RGB;
zWinGHeader.bmiHeader.biSizeImage=0;
zWinGHeader.bmiHeader.biclrued=256;
zWinGHeader.bmiHeader.biClrImportant=0;
zWinGHeader.bmiHeader.biHeight=-lYSize;
zWinGHeader.bmiHeader.biWidth=lXSize/2;
//创建彩色fot位图(灰度值)。
对于(i=0;i<256;i++)
{
zWinGHeader.bmiColors[i].rgbGreen=i;
zWinGHeader.bmiColors[i].rgbBlue=i;
zWinGHeader.bmiColors[i].rgred=i;
zWinGHeader.bmiColors[i].rgbReserved=0;
}
打破
违约:
案例bw8:
//创建位图信息头。
zWinGHeader.bmiHeader.biSize=sizeof(BitMapInfo头文件);
zWinGHeader.bmiHeader.biPlanes=1;
zWinGHeader.bmiHeader.bibibitCount=8;
zWinGHeader.bmiHeader.biCompression=BI_RGB;
zWinGHeader.bmiHeader.biSizeImage=0;
zWinGHeader.bmiHeader.biclrued=256;
zWinGHeader.bmiHeader.biClrImportant=0;
zWinGHeader.bmiHeader.biHeight=-lYSize;
zWinGHeader.bmiHeader.biWidth=lXSize;
//创建彩色fot位图(灰度值)。
对于(i=0;i<256;i++)
{
zWinGHeader.bmiColors[i].rgbGreen=i;
zWinGHeader.bmiColors[i].rgbBlue=i;
zWinGHead
PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hBmp)
{ 
 BITMAP bmp; 
 PBITMAPINFO pbmi; 
 WORD    cClrBits;
 // Retrieve the bitmap color format, width, and height. 
 if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&amp;bmp)) 
 return NULL;

 // Convert the color format to a count of bits. 
 cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); 
 if (cClrBits == 1) 
 cClrBits = 1; 
 else if (cClrBits <= 4) 
 cClrBits = 4; 
 else if (cClrBits <= 8) 
 cClrBits = 8; 
 else if (cClrBits <= 16) 
 cClrBits = 16; 
 else if (cClrBits <= 24) 
 cClrBits = 24; 
 else cClrBits = 32; 

 // Allocate memory for the BITMAPINFO structure. (This structure 
 // contains a BITMAPINFOHEADER structure and an array of RGBQUAD 
 // data structures.) 

 if (cClrBits != 24) 
 pbmi = (PBITMAPINFO) LocalAlloc(LPTR, 
 sizeof(BITMAPINFOHEADER) + 
 sizeof(RGBQUAD) * (1<< cClrBits)); 

 // There is no RGBQUAD array for the 24-bit-per-pixel format. 

 else 
 pbmi = (PBITMAPINFO) LocalAlloc(LPTR, 
 sizeof(BITMAPINFOHEADER)); 

 // Initialize the fields in the BITMAPINFO structure. 

 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
 pbmi->bmiHeader.biWidth = bmp.bmWidth; 
 pbmi->bmiHeader.biHeight = bmp.bmHeight; 
 pbmi->bmiHeader.biPlanes = bmp.bmPlanes; 
 pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; 
 if (cClrBits < 24) 
 pbmi->bmiHeader.biClrUsed = (1<<cClrBits); 

 // If the bitmap is not compressed, set the BI_RGB flag. 
 pbmi->bmiHeader.biCompression = BI_RGB; 

 // Compute the number of bytes in the array of color 
 // indices and store the result in biSizeImage. 
 // For Windows NT, the width must be DWORD aligned unless 
 // the bitmap is RLE compressed. This example shows this. 
 // For Windows 95/98/Me, the width must be WORD aligned unless the 
 // bitmap is RLE compressed.
 pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) &amp; ~31) /8
 * pbmi->bmiHeader.biHeight; 
 // Set biClrImportant to 0, indicating that all of the 
 // device colors are important. 
 pbmi->bmiHeader.biClrImportant = 0; 
 return pbmi; 
} 

void CreateBMPFile(LPTSTR pszFile, PBITMAPINFO pbi, 
 HBITMAP hBMP, HDC hDC) 
{ 
 HANDLE hf;                 // file handle 
 BITMAPFILEHEADER hdr;       // bitmap file-header 
 PBITMAPINFOHEADER pbih;     // bitmap info-header 
 LPBYTE lpBits;              // memory pointer 
 DWORD dwTotal;              // total count of bytes 
 DWORD cb;                   // incremental count of bytes 
 BYTE *hp;                   // byte pointer 
 DWORD dwTmp; 

 pbih = (PBITMAPINFOHEADER) pbi; 
 lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

 if (!lpBits) 
 return; 

 // Retrieve the color table (RGBQUAD array) and the bits 
 // (array of palette indices) from the DIB. 
 if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, 
 DIB_RGB_COLORS)) 
 {
 return;
 }

 // Create the .BMP file. 
 hf = CreateFile(pszFile, 
 GENERIC_READ | GENERIC_WRITE, 
 (DWORD) 0, 
 NULL, 
 CREATE_ALWAYS, 
 FILE_ATTRIBUTE_NORMAL, 
 (HANDLE) NULL); 
 if (hf == INVALID_HANDLE_VALUE) 
 return; 
 hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M" 
 // Compute the size of the entire file. 
 hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + 
 pbih->biSize + pbih->biClrUsed 
 * sizeof(RGBQUAD) + pbih->biSizeImage); 
 hdr.bfReserved1 = 0; 
 hdr.bfReserved2 = 0; 

 // Compute the offset to the array of color indices. 
 hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + 
 pbih->biSize + pbih->biClrUsed 
 * sizeof (RGBQUAD); 

 // Copy the BITMAPFILEHEADER into the .BMP file. 
 if (!WriteFile(hf, (LPVOID) &amp;hdr, sizeof(BITMAPFILEHEADER), 
 (LPDWORD) &amp;dwTmp,  NULL)) 
 {
 return; 
 }

 // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. 
 if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) 
 + pbih->biClrUsed * sizeof (RGBQUAD), 
 (LPDWORD) &amp;dwTmp, ( NULL))) 
 return; 

 // Copy the array of color indices into the .BMP file. 
 dwTotal = cb = pbih->biSizeImage; 
 hp = lpBits; 
 if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &amp;dwTmp,NULL)) 
 return; 

 // Close the .BMP file. 
 if (!CloseHandle(hf)) 
 return; 

 // Free memory. 
 GlobalFree((HGLOBAL)lpBits);
}


//code for saving bitmap
HBITMAP hBitmap;
HDC hdc;
...
PBITMAPINFO pBitmapInfo = CreateBitmapInfoStruct(hBitmap);
CreateBMPFile(_T("c:\\temp\\picture.bmp"), pBitmapInfo, hBitmap, hdc);