莫高葡萄酒专卖店:把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时处理过程很慢,并且你不能使用一些函
数,如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;}
把DIB转换成DDB
DDB转为DIB
DDB转DIB
Visual C++中DDB与DIB位图编程全攻略 Peter
把Flash动画转换成GIF动画图片
把WORD表格转换成EXCEL文档
六个步骤把资料转换成知识
六个步骤把资料转换成知识
六个步骤把资料转换成知识
六个步骤把资料转换成知识
PHOTOSHOP快速把风景图片转换成水墨画
六个步骤把资料转换成知识
把Flash动画转换成GIF动画图片
把word转换成PPT与把ppt转换成word
将ppt转换成JPG 和把JPG转换为ppt
如何把打印稿转换成电子稿
把图片(.jpeg格式)转换成word
教你快速把PDF转换成Word的方法
用Photoshop把真人头像转换成石膏雕像
怎样把PDF转换成WORD终极方法
怎么把PPT格式转换成swf格式
如何把WORD文件转换成TXT文件
Photoshop快速把白天转换成黑夜效果
一款可以把Flash动画转换成VCD的软件