在C Win32中使用hBitmap = CreateDIBSection()保存.bmp文件
我有以下代码。 我想用这个信息创建一个.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
}
使用win32 api从内存中的图像数据或HBITMAP到图像文件的最简单方法是使用GDI +。 只需从您的图像数据或HBITMAP创建一个Bitmap对象(请参阅http://msdn.microsoft.com/en-us/library/ms536314%28v=vs.85%29.aspx ),然后使用Save方法创建文件(请参阅http://sofzh.miximages.com/c/ 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<
如果你被允许使用C ++,你可以使用ATL
CImage
更容易(几行)。
CreateDIBSection
函数创建一个应用程序可以直接写入的DIB
*。 该函数为您提供指向位图位值的位置的指针。
此调用不会创建位图图像,为什么要使用该函数?
- 设备无关位图