莫高葡萄酒专卖店:把DIB转换成DDB

来源:百度文库 编辑:九乡新闻网 时间:2024/05/06 18:46:14
你可以不必将与设备无关(DIB)位图转换为与设备相关(DDB)位图,也能
将它显示在设备上。然而,当使用DIB时处理过程很慢,并且你不能使用一些函
数,如BitBlt,以为它只适用于DDB位图。

  有关从DIB位图转换为DDB位图有下面几步:

  1、根据DIB色表信息建立逻辑调色盘,只是在如果设备支持调色盘时需要这
样做。使用DIB色表中的信息初始化结构LOGPALETTE,使用CreatePalette()函
数建立调色盘。

  2、将逻辑调色盘选入想要建立DDB的DC中,并RealizePalette()。

  3、使用CreateDIBBitmap()函数建立DDB。

  4、不要忘记释放相关资源。

HBITMAP DIBToDDB( HANDLE hDIB )
{
LPBITMAPINFOHEADER lpbi;
HBITMAP hbm;
CPalette pal;
CPalette* pOldPal;
CClientDC dc(NULL);

if (hDIB == NULL)
return NULL;

lpbi = (LPBITMAPINFOHEADER)hDIB;

int nColors = lpbi->biClrUsed ? lpbi->biClrUsed :
1 << lpbi->biBitCount;

BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
LPVOID lpDIBBits;
if( bmInfo.bmiHeader.biBitCount > 8 )
lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors +
bmInfo.bmiHeader.biClrUsed) +
((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);

// Create and select a logical palette if needed
if( nColors <= 256 && dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE)
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];

pLP->palVersion = 0x300;
pLP->palNumEntries = nColors;

for( int i=0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed;
pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}

pal.CreatePalette( pLP );

delete[] pLP;

// Select and realize the palette
pOldPal = dc.SelectPalette( &pal, FALSE );
dc.RealizePalette();
}


hbm = CreateDIBitmap(dc.GetSafeHdc(), // handle to device context
(LPBITMAPINFOHEADER)lpbi, // pointer to bitmap info header
(LONG)CBM_INIT, // initialization flag
lpDIBBits, // pointer to initialization data
(LPBITMAPINFO)lpbi, // pointer to bitmap info
DIB_RGB_COLORS ); // color-data usage

if (pal.GetSafeHandle())
dc.SelectPalette(pOldPal,FALSE);

return hbm;
}
和上面重复的,但是结构更清晰
 你可以不必将与设备无关(DIB)位图转换为与设备相关(DDB)位图,也能将它显示在设备上。然而,当使用DIB时处理过程很慢,并且你不能使用一些函数,如BitBlt,以为它只适用于DDB位图。有关从DIB位图转换为DDB位图有下面几步:1、根据DIB色表信息建立逻辑调色盘,只是在如果设备支持调色盘时需要这样做。使用DIB色表中的信息初始化结构LOGPALETTE,使用CreatePalette()函数建立调色盘。2、将逻辑调色盘选入想要建立DDB的DC中,并RealizePalette()。3、使用CreateDIBBitmap()函数建立DDB。4、不要忘记释放相关资源。HBITMAP DIBToDDB( HANDLE hDIB ){LPBITMAPINFOHEADERlpbi;HBITMAP hbm;CPalettepal;CPalette*pOldPal;CClientDCdc(NULL);if (hDIB == NULL)return NULL;lpbi = (LPBITMAPINFOHEADER)hDIB;int nColors = lpbi->biClrUsed ? lpbi->biClrUsed :1 << lpbi->biBitCount;BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;LPVOID lpDIBBits;if( bmInfo.bmiHeader.biBitCount > 8 )lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors +bmInfo.bmiHeader.biClrUsed) +((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));elselpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);// Create and select a logical palette if neededif( nColors <= 256 && dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE){UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];pLP->palVersion = 0x300;pLP->palNumEntries = nColors;for( int i=0; i < nColors; i++){pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed;pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen;pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue;pLP->palPalEntry[i].peFlags = 0;}pal.CreatePalette( pLP );delete[] pLP;// Select and realize the palettepOldPal = dc.SelectPalette( &pal, FALSE );dc.RealizePalette();}hbm = CreateDIBitmap(dc.GetSafeHdc(),// handle to device context(LPBITMAPINFOHEADER)lpbi,// pointer to bitmap info header(LONG)CBM_INIT,// initialization flaglpDIBBits,// pointer to initialization data(LPBITMAPINFO)lpbi,// pointer to bitmap infoDIB_RGB_COLORS );// color-data usageif (pal.GetSafeHandle())dc.SelectPalette(pOldPal,FALSE);return hbm;}