首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

BITMAP结构解决方法

2012-01-26 
BITMAP结构BITMAPINFOHEADER和BITMAPCOREHEADER这两个结构怎么区别,一般的位图存储都是第一个结构体,用Pho

BITMAP结构
BITMAPINFOHEADER和BITMAPCOREHEADER这两个结构怎么区别,一般的位图存储都是第一个结构体,用PhotoShop存储的位图也是用第一个结构体,什么情况下用BITMAPCOREHEADER这个结构体,怎么用来显示图像呢?

这两个结构体怎么区别呀?

比如用StretchDIBits这个API来显示DIB,这个函数其中的一个参数是BITMAPINFO这个结构有一成员是BITMAPINFOHEADER,如果该位图用的是BITMAPCOREHEADER结构,那StretchDIBits这个API不能用了,那怎么显示图像呢??

[解决办法]
使用bcSize或biSize区别
你确认StretchDIBits不能用?
[解决办法]

C/C++ code
  static   BOOL   IsWinDIB(BITMAPINFOHEADER   *pBIH)     {             ASSERT(pBIH);             if   (((BITMAPCOREHEADER   *)pBIH)->bcSize   ==   sizeof(BITMAPCOREHEADER))   {                     return   FALSE;             }             return   TRUE;     }
[解决办法]
C/C++ code
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))

热点排行