欢迎来到天天文库
浏览记录
ID:24802024
大小:19.20 KB
页数:4页
时间:2018-11-15
《绘制灰度图像(vcmfc图像编程技巧)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、绘制灰度图像有时一幅灰度位图比一幅彩色位图更能吸引人,如在一些游戏中对往事的回忆常把场景设置成灰色,是不是有一种往事的感觉?对于位图的灰度显示技术在很多文章中都有介绍,但它们大多都是针对DOS下的程序,有些是WINDOWS下的,但它们只涉及到对系统调色板的修改,对系统不支持调色板的情况却没有提及。如今,系统随着软硬件的不断升级,系统已从过去的256色过渡到真彩色,再不支持调色板,过去的处理方法也就无能为力了,虽然我们可以将系统的颜色属性设置成256色,但这并不是一种好办法,其实我们可以直接修改位图
2、的调色板来达到我们的目的。下面是我给出的一段程序,愿与大家共享。方法如下:1、求位图的颜色数,判断是否小于256。2、利用GetDeviceCaps(RASTERCAPS)函数与PC_PALETTE,确定系统是否支持调色板。3、如果系统支持调色板,创建逻辑调色板,并用位图颜色表的颜色值转化成对应灰度值赋予系统调色板。4、如果系统不支持调色板,直接修改位图的颜色表。5、显示位图。对于灰度转换的计算公式,我们可选用经典公式nGray=0.299*R+0.587*G+0.114*B//参数说明:hDIB
3、--位图句柄voidDrawGray2D(CDC*pDC,HANDLEhDIB){CPalettepal;CPalette*OldPal;BITMAPINFO&bmInfo=*(LPBITMAPINFO)hDIB;//计算位图颜色数intnColors=bmInfo.bmiHeader.biClrUsed?bmInfo.bmiHeader.biClrUsed:1<GetDeviceCaps(RASTERCAPS)&RC_P
4、ALETTE&&nColors<=256){//如果系统支持调色板且位图小于256色。//分配内存给调色板UINTnSize=sizeof(LOGPALETTE)+(sizeof(PALETTEENTRY)*nColors);LOGPALETTE*pLP=(LOGPALETTE*)newBYTE[nSize];//初始化系统调色板版本号pLP->palVersion=0x300;//调色版颜色数pLP->palNumEntries=nColors;//设置灰度调色板for(inti=0;i5、lors;i++){intnGray=(bmInfo.bmiColors[i].rgbRed*299+bmInfo.bmiColors[i].rgbGreen*587+bmInfo.bmiColors[i].rgbBlue*114)/1000;//修改系统调色板pLP->palPalEntry[i].peRed=nGray;pLP->palPalEntry[i].peGreen=nGray;pLP->palPalEntry[i].peBlue=nGray;pLP->palPalEntry[i].p6、eFlags=0;}pal.CreatePalette(pLP);delete[]pLP;//选择调色板OldPal=pDC->SelectPalette(&pal,FALSE);pDC->RealizePalette();}elseif((pDC->GetDeviceCaps(RASTERCAPS)&RC_PALETTE)==0&&nColors<=256){//系统不支持调色板,但位图颜色小于256色for(inti=0;i7、olors[i].rgbRed*299+bmInfo.bmiColors[i].rgbGreen*587+bmInfo.bmiColors[i].rgbBlue*114)/1000;//修改位图调色板bmInfo.bmiColors[i].rgbRed=nGray;bmInfo.bmiColors[i].rgbGreen=nGray;bmInfo.bmiColors[i].rgbBlue=nGray;}}intnWidth=bmInfo.bmiHeader.biWidth;intnHeight=b8、mInfo.bmiHeader.biHeight;LPVOIDlpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors);//绘制位图::SetDIBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);if(pDC->GetDeviceCaps(RASTERCAPS)&RC_PALETTE)pDC->Se
5、lors;i++){intnGray=(bmInfo.bmiColors[i].rgbRed*299+bmInfo.bmiColors[i].rgbGreen*587+bmInfo.bmiColors[i].rgbBlue*114)/1000;//修改系统调色板pLP->palPalEntry[i].peRed=nGray;pLP->palPalEntry[i].peGreen=nGray;pLP->palPalEntry[i].peBlue=nGray;pLP->palPalEntry[i].p
6、eFlags=0;}pal.CreatePalette(pLP);delete[]pLP;//选择调色板OldPal=pDC->SelectPalette(&pal,FALSE);pDC->RealizePalette();}elseif((pDC->GetDeviceCaps(RASTERCAPS)&RC_PALETTE)==0&&nColors<=256){//系统不支持调色板,但位图颜色小于256色for(inti=0;i7、olors[i].rgbRed*299+bmInfo.bmiColors[i].rgbGreen*587+bmInfo.bmiColors[i].rgbBlue*114)/1000;//修改位图调色板bmInfo.bmiColors[i].rgbRed=nGray;bmInfo.bmiColors[i].rgbGreen=nGray;bmInfo.bmiColors[i].rgbBlue=nGray;}}intnWidth=bmInfo.bmiHeader.biWidth;intnHeight=b8、mInfo.bmiHeader.biHeight;LPVOIDlpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors);//绘制位图::SetDIBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);if(pDC->GetDeviceCaps(RASTERCAPS)&RC_PALETTE)pDC->Se
7、olors[i].rgbRed*299+bmInfo.bmiColors[i].rgbGreen*587+bmInfo.bmiColors[i].rgbBlue*114)/1000;//修改位图调色板bmInfo.bmiColors[i].rgbRed=nGray;bmInfo.bmiColors[i].rgbGreen=nGray;bmInfo.bmiColors[i].rgbBlue=nGray;}}intnWidth=bmInfo.bmiHeader.biWidth;intnHeight=b
8、mInfo.bmiHeader.biHeight;LPVOIDlpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors);//绘制位图::SetDIBitsToDevice(pDC->m_hDC,0,0,nWidth,nHeight,0,0,0,nHeight,lpDIBBits,(LPBITMAPINFO)hDIB,DIB_RGB_COLORS);if(pDC->GetDeviceCaps(RASTERCAPS)&RC_PALETTE)pDC->Se
此文档下载收益归作者所有