彩色变为灰色.docx
- 文档编号:12650460
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:27
- 大小:23.05KB
彩色变为灰色.docx
《彩色变为灰色.docx》由会员分享,可在线阅读,更多相关《彩色变为灰色.docx(27页珍藏版)》请在冰豆网上搜索。
彩色变为灰色
彩色变为灰色:
1:
建立菜单,消息映射
2:
编写映射函数
voidCBianhuanView:
:
OnHuise()//彩色图变为灰度图
{//k=1;//k=1用于标记执行过该函数
CBianhuanDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
LPSTRlpDIB;//指向DIB的指针
LPSTRlpDIBBits;//指向DIB象素指针
DWORDWide;//DIB中图像的宽度
DWORDHeight;//DIB中图像的高度
lpDIB=(LPSTR):
:
GlobalLock((HGLOBAL)pDoc->GetHObject());
Wide=pDoc->GetDibImage()->GetWidth(lpDIB);
Height=pDoc->GetDibImage()->GetHeight(lpDIB);
lpDIBBits=pDoc->GetDibImage()->GetBits(lpDIB);
pDoc->GetDibImage()->Huise(lpDIBBits,Wide,Height);
:
:
GlobalUnlock((HGLOBAL)pDoc->GetHObject());
pDoc->UpdateAllViews(NULL);//更新视图
EndWaitCursor();
}
实现以上函数,需要以下准备:
(1)BianhuanDoc.h中增加成员变量:
protected:
HGLOBALm_hDIB;
CDib*m_pDibImage;//新增加的!
!
!
!
!
!
(2)BianhuanDoc.h中增加成员函数
A.HGLOBALGetHObject()const//获取Dib对象的句柄
{returnm_hDIB;}
B.CDib*GetDibImage()const//新增加的!
!
!
!
!
!
{returnm_pDibImage;}
(3)Dib.h中增加成员函数:
A.LPSTRGetBits(LPSTR);//取得位图数据的入口地址
B.WORDGetPalSize(LPSTR);//取得调色板的大小
C.WORDGetColorNum(LPSTR);//取得位图包含的颜色数目
(4)Dib.cpp中
A.LPSTRCDib:
:
GetBits(LPSTRlpdib)
{return(lpdib+((LPBITMAPINFOHEADER)lpdib)->biSize+GetPalSize(lpdib));
//return(lpdib+*(LPDWORD)lpdib+GetPalSize(lpdib));
}
B.WORDCDib:
:
GetPalSize(LPSTRlpdib)
{
return(WORD)(GetColorNum(lpdib)*sizeof(RGBQUAD));//计算DIB中调色板的大小
C.WORDCDib:
:
GetColorNum(LPSTRlpdib)
{
longdwClrUsed=((LPBITMAPINFOHEADER)lpdib)->biClrUsed;//读取dwClrUsed值
if(dwClrUsed!
=0)
{
return(WORD)dwClrUsed;//如果dwClrUsed不为0,直接返回该值
}
WORDwBitCount=((LPBITMAPINFOHEADER)lpdib)->biBitCount;//读取biBitCount值
switch(wBitCount)//按照像素的位数计算颜色数目
{
case1:
return2;
case4:
return16;
case8:
return256;
default:
return0;
}
}
(5)编写灰色函数
voidCDib:
:
Huise(LPSTRlpDIBBits,LONGlWidth,LONGlHeight)
{inti,j;
LONGlLineBytes;
//unsignedchar*lpSrc;
lLineBytes=WIDTHBYTES(lWidth*8);
for(i=0;i {//逐列扫描 for(j=0;j {//指向DIB第i行,第j个象素的指针 BYTE*lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*3*i+3*j;//变换 unsignedchartemp=0.114*(*lpSrc)+0.587*(*(1+lpSrc))+0.299*(*(2+lpSrc)); *lpSrc=temp; lpSrc++; *lpSrc=temp; lpSrc++; *lpSrc=temp; lpSrc++; } } } 下面是Dib.h //Dib.h: interfacefortheCDibclass. #if! defined(AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_) #defineAFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_ #if_MSC_VER>1000 #pragmaonce #endif//_MSC_VER>1000 #definePalVersion0x300//调色板版本//DIB常量 #defineWIDTHBYTES(bits)(((bits)+31)/32*4)//自己新增加的! ! ! ! ! ! ! ! ! ! ! ! classCDib: publicCObject {public: CDib(); virtual~CDib(); //operations public: //用于操作DIB的函数声明 BOOLDrawDib(HDC,LPRECT,HGLOBAL,LPRECT,CPalette*);//显示位图 BOOLConstructPalette(HGLOBAL,CPalette*);//构造逻辑调色板 LPSTRGetBits(LPSTR);//取得位图数据的入口地址 DWORDGetWidth(LPSTR);//取得位图的宽度 DWORDGetHeight(LPSTR);//取得位图的高度 WORDGetPalSize(LPSTR);//取得调色板的大小 WORDGetColorNum(LPSTR);//取得位图包含的颜色数目 WORDGetBitCount(LPSTR);//取得位图的颜色深度 HGLOBALCopyObject(HGLOBAL);//用于复制位图对象 BOOLCreateDIBPalette(HGLOBALhDib,CPalette*pPal);//增加此函数! ! ! ! ! ! ! ! ! ! ! ! ! voidHuise(LPSTRlpDIBBits,LONGlWidth,LONGlHeight);//增加此函数原型 BOOLSaveFile(HGLOBAL,CFile&);//存储位图为文件 HGLOBALLoadFile(CFile&);//从文件中加载位图 //在对图象进行处理时,针对位图的字节宽度必须是4的倍数的这一要求, //我们设计了函数GetRequireWidth,来处理这种比较特殊的情况 intGetReqByteWidth(int);//转换后的字节数GetRequireByteWidth longGetRectWidth(LPCRECT);//取得区域的宽度 longGetRectHeight(LPCRECT);//取得区域的高度 public: voidClearMemory(); voidInitMembers(); public: BOOLRuihua(LPSTRlpDIBBits,LONGlWidth,LONGlHeight,intiTempH,intiTempW,intiTempMX,intiTempMY,FLOAT*fpArray,FLOATfCoef); LPBITMAPINFOlpbminfo;//指向BITMAPINFO结构的指针 LPBITMAPINFOHEADERlpbmihrd;//指向BITMAPINFOHEADER结构的指针 BITMAPFILEHEADERbmfHeader;//BITMAPFILEHEADER结构 LPSTRlpdib;//指向DIB的指针 LPSTRlpDIBBits;//DIB像素指针 DWORDdwDIBSize;//DIB大小 HGLOBALm_hDib;//DIB对象的句柄 RGBQUAD*lpRgbQuag;//指向颜色表的指针 }; #endif//! defined(AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_) ! ! ! ! 下面是Dib.cpp //MyDib.cpp: implementationoftheCDibclass. #include"stdafx.h" #include"Dib.h" #include #ifdef_DEBUG #undefTHIS_FILE staticcharTHIS_FILE[]=__FILE__; #definenewDEBUG_NEW #endif /* *Dib文件头标志(字符串"BM") */ #defineDIB_MARKER((WORD)('M'<<8)|'B') ////////////////////////////////////////////////////////////////////// //Construction/Destruction ////////////////////////////////////////////////////////////////////// CDib: : CDib() {InitMembers();} CDib: : ~CDib() {ClearMemory();} /************************************************************************* *函数名称: DrawDib() *参数说明: *HDChDC,输出设备DC *LPRECTlpDCRect,绘制矩形区域 *HGLOBALhDIB,DIB对象的句柄 *LPRECTlpDIBRect,DIB的输出区域 *CPalette*pPal,调色板的指针 *函数类型: BOOL *函数功能: 该函数主要用来绘制DIB对象 ************************************************************************/ BOOLCDib: : DrawDib(HDChDC, LPRECTlpDCRect, HGLOBALhDIB, LPRECTlpDIBRect, CPalette*pPal) { BOOLbSuccess=FALSE;//重画成功标志 HPALETTEhOldPal=NULL;//以前的调色板 if(hDIB==NULL)//判断是否是有效的DIB对象 {returnFALSE;//不是,则返回} lpdib=(LPSTR): : GlobalLock((HGLOBAL)hDIB);//锁定DIB lpDIBBits=GetBits(lpdib);//找到DIB图象像素起始位置 if(pPal! =NULL)//获取DIB调色板,并选取到设备环境中它 {HPALETTEhPal=(HPALETTE)pPal->m_hObject; hOldPal=: : SelectPalette(hDC,hPal,TRUE);} : : SetStretchBltMode(hDC,COLORONCOLOR);//设置显示模式 bSuccess=: : StretchDIBits(hDC,//设备环境句柄 lpDCRect->left,//目标X坐标 lpDCRect->top,//目标Y坐标 GetRectWidth(lpDCRect),//目标宽度 GetRectHeight(lpDCRect),//目标高度 lpDIBRect->left,//源X坐标 lpDIBRect->top,//源Y坐标 GetRectWidth(lpDIBRect),//源宽度 GetRectHeight(lpDIBRect),//源高度 lpDIBBits,//指向dib像素的指针 (LPBITMAPINFO)lpdib,//指向位图信息结构的指针 DIB_RGB_COLORS,//使用的颜色数目 SRCCOPY);//光栅操作类型 : : GlobalUnlock(hDIB);//解除锁定 if(hOldPal! =NULL)//恢复系统调色板 {: : SelectPalette(hDC,hOldPal,TRUE);} returnbSuccess;} /*函数名称: 增加此函数! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! *CreateDIBPalette() *参数: *HDIBhDIB-指向DIB对象的指针 *CPalette*pPal-指向DIB对象调色板的指针 *返回值: *BOOL-创建成功返回TRUE,否则返回FALSE。 *说明: *该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中, *最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。 这样 *可以用最好的颜色来显示DIB图像。 ************************************************************************/ BOOLCDib: : CreateDIBPalette(HGLOBALhDib,CPalette*pPal) {LPLOGPALETTElpPal;//指向逻辑调色板的指针 HANDLEhLogPal;//逻辑调色板的句柄 HPALETTEhPal=NULL;//调色板的句柄 inti;//循环变量 WORDwNumColors;//颜色表中的颜色数目 LPSTRlpbi;//指向DIB的指针 LPBITMAPINFOlpbmi;//指向BITMAPINFO结构的指针(Win3.0) LPBITMAPCOREINFOlpbmc;//指向BITMAPCOREINFO结构的指针 BOOLbWinStyleDIB;//表明是否是Win3.0DIB的标记 BOOLbResult=FALSE;//创建结果 if(hDib==NULL) {returnFALSE;} lpbi=(LPSTR): : GlobalLock((HGLOBAL)hDib);//锁定DIB lpbmi=(LPBITMAPINFO)lpbi;//获取指向BITMAPINFO结构的指针(Win3.0) lpbmc=(LPBITMAPCOREINFO)lpbi;//获取指向BITMAPCOREINFO结构的指针 wNumColors=GetColorNum(lpbi);//获取DIB中颜色表中的颜色数目 if(wNumColors! =0) {//分配为逻辑调色板内存 hLogPal=: : GlobalAlloc(GHND,sizeof(LOGPALETTE) +sizeof(PALETTEENTRY) *wNumColors); //如果内存不足,退出 if(hLogPal==0) {: : GlobalUnlock((HGLOBAL)hDib);//解除锁定 returnFALSE; } lpPal=(LPLOGPALETTE): : GlobalLock((HGLOBAL)hLogPal); //lpPal->palVersion=PALVERSION;//设置版本号 lpPal->palNumEntries=(WORD)wNumColors;//设置颜色数目 //bWinStyleDIB=IS_WIN30_DIB(lpbi);//判断是否是WIN3.0的DIB //读取调色板 for(i=0;i<(int)wNumColors;i++) {if(bWinStyleDIB) {//读取红色绿色蓝色分量 lpPal->palPalEntry[i].peRed=lpbmi->bmiColors[i].rgbRed; lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen; lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue; //保留位 lpPal->palPalEntry[i].peFlags=0; } else {//读取红色绿色蓝色分量 lpPal->palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed; lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen; lpPal->palPalEntry[i].peBlue=lpbmc->bmciColors[i].rgbtBlue; //保留位 lpPal->palPalEntry[i].peFlags=0; } } bResult=pPal->CreatePalette(lpPal);//按照逻辑调色板创建调色板,并返回指针 : : GlobalUnlock((HGLOBAL)hLogPal);//解除锁定 : : GlobalFree((HGLOBAL)hLogPal);//释放逻辑调色板 } : : GlobalUnlock((HGLOBAL)hDib);//解除锁定 returnbResult; } /************************************************************************* *函数名称: ConstructPalette(HGLOBALhDIB,CPalette*pPal) *函数参数: *HGLOBALhDIB,DIB对象的句柄 *CPalette*pPal,调色板的指针 *函数类型: BOOL *函数说明: 该函数按照DIB创建一个逻辑调色板 ************************************************************************/ BOOLCDib: : ConstructPalette(HGLOBALhDIB,CPalette*pPal) {HANDLEhLogPal;//逻辑调色板的句柄 intiLoop;//循环变量 BOOLbSuccess=FALSE;//创建结果 if(hDIB==NULL)//判断是否是有效的DIB对象 {returnFALSE;//返回FALSE} lpdib=(LPSTR): : GlobalLock((HGLOBAL)hDIB);//锁定DIB lpbminfo=(LPBITMAPINFO)lpdib; longwNumColors=GetColorNum(lpdib);//获取DIB中颜色表中的颜色数目 if(wNumColors! =0) {hLogPal=: : GlobalAlloc(GHND,sizeof(LOGPALETTE)//分配为逻辑调色板内存 +sizeof(PALETTEENTRY) *wNumColors); if(hLogPal==0)//如果失败则退出 {: : GlobalUnlock((HGLOBAL)hDIB);//解除锁定 returnFALSE;} LPLOGPALETTElpPal=(LPLOGPALETTE): : GlobalLock((HGLOBAL)hLogPal); lpPal->palVersion=PalVersion;//设置调色板版本号 lpPal->palNumEntries=(WORD)wNumColors;//设置颜色数目 for(iLoop=0;iLoop<(int)wNumColors;iLoop++)//读取调色板 {lpPal->palPalEntry[iLoop].peRed=lpbminfo->bmiColors[iLoop].rgbRed;//读取三原色分量 lpPal->palPalEntry[iLoop].peGreen=lpbminfo-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 彩色 变为 灰色