BITMAP结构
BITMAPINFOHEADER和BITMAPCOREHEADER这两个结构怎么区别,一般的位图存储都是第一个结构体,用PhotoShop存储的位图也是用第一个结构体,什么情况下用BITMAPCOREHEADER这个结构体,怎么用来显示图像呢?
这两个结构体怎么区别呀?
比如用StretchDIBits这个API来显示DIB,这个函数其中的一个参数是BITMAPINFO这个结构有一成员是BITMAPINFOHEADER,如果该位图用的是BITMAPCOREHEADER结构,那StretchDIBits这个API不能用了,那怎么显示图像呢??
[解决办法]
使用bcSize或biSize区别
你确认StretchDIBits不能用?
[解决办法]
static BOOL IsWinDIB(BITMAPINFOHEADER *pBIH) { ASSERT(pBIH); if (((BITMAPCOREHEADER *)pBIH)->bcSize == sizeof(BITMAPCOREHEADER)) { return FALSE; } return TRUE; }
[解决办法]
BOOL bSuccess ; DWORD dwFileSize, dwHighSize, dwBytesRead ; HANDLE hFile ; BITMAPFILEHEADER * pbmfh ; BITMAPINFO * pbmi ; BYTE * pBits ; int cxDib, cyDib ; CString pstrFileName="c:\\mypic.bmp"; hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ; if (hFile == INVALID_HANDLE_VALUE) return ; dwFileSize = GetFileSize (hFile, &dwHighSize) ; if (dwHighSize) { CloseHandle (hFile) ; return ; } pbmfh = (BITMAPFILEHEADER *)malloc (dwFileSize) ; if (!pbmfh) { CloseHandle (hFile) ; return ; } bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ; CloseHandle (hFile) ; if (!bSuccess || (dwBytesRead != dwFileSize) || (pbmfh->bfType != * (WORD *) "BM") || (pbmfh->bfSize != dwFileSize)) { free (pbmfh) ; return ; } this->Invalidate(); if (pbmfh == NULL) { MessageBox (TEXT ("Cannot load DIB file"), "ShowDIB", MB_ICONEXCLAMATION | MB_OK) ; return ; } // 取得位图信息结构体的指针和位图数据数组的指针 pbmi = (BITMAPINFO *) (pbmfh + 1) ; pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ; // Get the DIB width and height if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER)) { cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ; cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ; } else { cxDib = pbmi->bmiHeader.biWidth ; cyDib = abs (pbmi->bmiHeader.biHeight) ; } PAINTSTRUCT ps ; HDC hdc = hdc = ::BeginPaint (this->GetSafeHwnd(), &ps) ; CRect winrect; this->GetClientRect(&winrect); StretchDIBits (hdc, 0, 0, winrect.Width(), winrect.Height(), 0, 0, cxDib, cyDib, pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ; ::EndPaint (this->GetSafeHwnd(), &ps) ;
[解决办法]
在OS/2样式的DIB内,BITMAPFILEHEADER结构后紧跟了BITMAPCOREHEADER结构,它提供了关于DIB图像的基本信息。
typedef struct tagBITMAPCOREHEADER // bmch
{
DWORD bcSize ; // size of the structure = 12
WORD bcWidth ; // width of image in pixels
WORD bcHeight ; // height of image in pixels
WORD bcPlanes ; // = 1
WORD bcBitCount ; // bits per pixel (1, 4, 8, or 24)
}
BITMAPCOREHEADER, * PBITMAPCOREHEADER ;
typedef struct tagBITMAPINFOHEADER // bmih
{
DWORD biSize ; // size of the structure = 40
LONG biWidth ; // width of the image in pixels
LONG biHeight ; // height of the image in pixels
WORD biPlanes ; // = 1
WORD biBitCount ; // bits per pixel (1, 4, 8, 16, 24, or 32)
DWORD biCompression ; // compression code
DWORD biSizeImage ; // number of bytes in image
LONG biXPelsPerMeter ; // horizontal resolution
LONG biYPelsPerMeter ; // vertical resolution
DWORD biClrUsed ; // number of colors used
DWORD biClrImportant ; // number of important colors
}
BITMAPINFOHEADER, * PBITMAPINFOHEADER ;
您可以通过检查结构的第一字段区分与OS/2兼容的DIB和Windows DIB,前者为12,后者为40。
就是说这两个结构1个是os/2的,1个是windows用的。
详情参照此网页:与设备无关的位图
[解决办法]
The BITMAPCOREINFO structure combines the BITMAPCOREHEADER structure and a color table to provide a complete definition of DIB dimensions and colors. For more information about specifying a DIB, see BITMAPCOREINFO.
An application should use the information stored in the bcSize member to locate the color table in a BITMAPCOREINFO structure.
The following code sample shows how to locate the color table.
pColor = ((LPBYTE) pBitmapCoreInfo +
(WORD) (pBitmapCoreInfo -> bcSize))