图像处理---黑白化

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

核心对象:

图像处理---黑白化CImagem_imageFile;

绘制图片:

图像处理---黑白化voidCFigureView::OnDraw(CDC*pDC)
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{
图像处理---黑白化CFigureDoc
*pDoc=GetDocument();
图像处理---黑白化ASSERT_VALID(pDoc);
图像处理---黑白化
if(!pDoc)
图像处理---黑白化
return;
图像处理---黑白化
图像处理---黑白化
//TODO:在此处为本机数据添加绘制代码
图像处理---黑白化
CBrushBackBrush;
图像处理---黑白化BackBrush.CreateSolidBrush(RGB(
255,255,255));
图像处理---黑白化CBrush
*pOldBrush=pDC->SelectObject(&BackBrush);
图像处理---黑白化CRectrect;
图像处理---黑白化
this->GetClientRect(&rect);
图像处理---黑白化pDC
->Rectangle(rect);//CRect(-1,-1,3000,3000));
图像处理---黑白化
pDC->SelectObject(pOldBrush);
图像处理---黑白化
if(!m_imageFile.IsNull())
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{//图片不为空
图像处理---黑白化
m_imageFile.StretchBlt(pDC->m_hDC,CRect(&m_rectShow),SRCCOPY);//复制图片到显示设备
图像处理---黑白化
}

图像处理---黑白化}

图像处理---黑白化

打开图片:

图像处理---黑白化voidCFigureView::OnFileOpen()
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{//打开图片文件
图像处理---黑白化
//TODO:在此添加命令处理程序代码
图像处理---黑白化
CStringstrFilter;
图像处理---黑白化CStringstrImageFileName;
图像处理---黑白化CSimpleArray
<GUID>aguidFileTypes;
图像处理---黑白化HRESULThResult;
图像处理---黑白化hResult
=m_imageFile.GetExporterFilterString(strFilter,aguidFileTypes);
图像处理---黑白化
if(FAILED(hResult))
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{
图像处理---黑白化MessageBox(
"装入文件类型过滤器操作失败","消息提示",MB_OK);
图像处理---黑白化
return;
图像处理---黑白化}

图像处理---黑白化strFilter
="AllFile(*.*)|*.*|"+strFilter;
图像处理---黑白化CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,strFilter);
图像处理---黑白化hResult
=(int)dlg.DoModal();
图像处理---黑白化
if(hResult!=IDOK)
图像处理---黑白化
return;
图像处理---黑白化strImageFileName.Format(dlg.GetFileName());
图像处理---黑白化m_imageFile.Destroy();
图像处理---黑白化hResult
=m_imageFile.Load(strImageFileName);
图像处理---黑白化
if(FAILED(hResult))
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{
图像处理---黑白化MessageBox(
"装入图像文件操作失败","消息提示",MB_OK);
图像处理---黑白化
return;
图像处理---黑白化}

图像处理---黑白化m_rectShow
=CRect(0,0,m_imageFile.GetWidth(),m_imageFile.GetHeight());//显示区域
图像处理---黑白化
SetScrollSizes(MM_TEXT,CSize(m_rectShow.Width(),m_rectShow.Height()));
图像处理---黑白化CWnd
*pWnd=AfxGetMainWnd();
图像处理---黑白化pWnd
->SetWindowTextA("当前正在打开的文件名称为:"+strImageFileName);
图像处理---黑白化Invalidate();
//刷新
图像处理---黑白化
}

图像处理---黑白化

进行黑白化处理:

图像处理---黑白化voidCFigureView::MakeBlackWhiteImage(CImage&pImage,intiType)
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{//黑白化
图像处理---黑白化
CWaitCursorWaitCursor;
图像处理---黑白化
intHeight=pImage.GetHeight();//高度
图像处理---黑白化
intWidth=pImage.GetWidth();//宽度
图像处理---黑白化
if(!pImage.IsIndexed())//Indicatesthatabitmap'scolorsaremappedtoanindexedpalette
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{//没有使用调色板
图像处理---黑白化
for(intx=0;x<Width;x++)
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{
图像处理---黑白化
for(inty=0;y<Height;y++)
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{
图像处理---黑白化COLORREFpixel
=pImage.GetPixel(x,y);//Retrievesthecolorofthepixelatthelocationspecifiedbyxandy.
图像处理---黑白化
byter,g,b,Result;
图像处理---黑白化r
=GetRValue(pixel);
图像处理---黑白化g
=GetGValue(pixel);
图像处理---黑白化b
=GetBValue(pixel);
图像处理---黑白化
switch(iType)
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{
图像处理---黑白化
case0:
图像处理---黑白化Result
=((r+g+b)/3);
图像处理---黑白化
break;
图像处理---黑白化
case1:
图像处理---黑白化Result
=max(max(r,g),b);
图像处理---黑白化
break;
图像处理---黑白化
case2:
图像处理---黑白化Result
=(2.7*r+0.2*g+0.1*b);
图像处理---黑白化
break;
图像处理---黑白化}

图像处理---黑白化pImage.SetPixel(x,y,RGB(Result,Result,Result));
图像处理---黑白化}

图像处理---黑白化}

图像处理---黑白化}

图像处理---黑白化
else
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{//使用调色板
图像处理---黑白化
intMaxColors=pImage.GetMaxColorTableEntries();//Retrievesthemaximumnumberofentriesinthecolortable
图像处理---黑白化
RGBQUAD*ColorTable=newRGBQUAD[MaxColors];
图像处理---黑白化
//Retrievesred,green,blue(RGB)colorvaluesfromarangeofentriesinthepaletteoftheDIBsection
图像处理---黑白化
pImage.GetColorTable(0,MaxColors,ColorTable);
图像处理---黑白化
for(inti=0;i<MaxColors;i++)
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{
图像处理---黑白化
byter,g,b,Result;
图像处理---黑白化r
=ColorTable[i].rgbRed;
图像处理---黑白化g
=ColorTable[i].rgbGreen;
图像处理---黑白化b
=ColorTable[i].rgbBlue;
图像处理---黑白化
switch(iType)
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{
图像处理---黑白化
case0:
图像处理---黑白化Result
=((r+g+b)/3);
图像处理---黑白化
break;
图像处理---黑白化
case1:
图像处理---黑白化Result
=max(max(r,g),b);
图像处理---黑白化
break;
图像处理---黑白化
case2:
图像处理---黑白化Result
=(2.7*r+0.2*g+0.1*b);
图像处理---黑白化
break;
图像处理---黑白化}

图像处理---黑白化ColorTable[i].rgbRed
=Result;
图像处理---黑白化ColorTable[i].rgbGreen
=Result;
图像处理---黑白化ColorTable[i].rgbBlue
=Result;
图像处理---黑白化}

图像处理---黑白化pImage.SetColorTable(
0,MaxColors,ColorTable);
图像处理---黑白化deleteColorTable;
图像处理---黑白化}

图像处理---黑白化}

图像处理---黑白化
图像处理---黑白化
voidCFigureView::OnPsBw()
图像处理---黑白化图像处理---黑白化
图像处理---黑白化{//图片黑白化
图像处理---黑白化
//TODO:在此添加命令处理程序代码
图像处理---黑白化
MakeBlackWhiteImage(m_imageFile,0);
图像处理---黑白化
图像处理---黑白化CFigureDoc
*pDoc=GetDocument();
图像处理---黑白化ASSERT_VALID(pDoc);
图像处理---黑白化
if(!pDoc)
图像处理---黑白化
return;
图像处理---黑白化pDoc
->SetModifiedFlag(TRUE);//设置修改标志
图像处理---黑白化
Invalidate();
图像处理---黑白化}

图像处理---黑白化

处理效果:

图像处理---黑白化