当前位置:编程学习 > VC++ >>

VC++.net处理图像变化

Author:Insun
Blog:http://yxmhero1989.blog.163.com
From:www.4safer.com
Programming Environment :winXP &VC++.net 2003(虽然有05和2010试用版,还是钟爱03)
 
为了方便,借用老king(金登男)的ppt直接另存导出JPEG格式图片讲解。【Visual C++.NET图像处理编程(附光盘)/陆宗骐/金登男】
 老king给我们讲解Visual C++.NET图像处理编程时候蛮好的,犀利的,那本书是陆宗骐合编的,记得陆宗骐曾自己独编C++图像处理编程,都是差不多。索取ppt的留邮箱。
 
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
最简单的色调变换是颜色反相和彩色图像变黑白
颜色反相:
真彩色图像的3个颜色分量都需进行这样的运算(g=Max-f)
非真彩色图像只需修改调色板单元的数值
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
//====================颜色反相处理==================
//菜单:图像变化/色调变化:颜色反相
void CImageView::OnInvertColor()
{
 // TODO: 在此添加命令处理程序代码
 CClientDC dc(this);
 int     nStartX,nStartY,nCanvusDrawWidth;
 if(!WorkCanvus.IsNull())
 {
//显示工作画布
  nStartX=0;
  nStartY=0;
  nCanvusDrawWidth=DrawCanvus(&WorkCanvus,&dc,nStartX,nStartY);
//将工作画布经过颜色反相处理后复制到副本画布上
  InvertImage(&SaveCanvus,&WorkCanvus);
//显示副本画布
  nStartX=WorkCanvus.GetWidth()+10;
  nStartY=0;
  DrawCanvus(&SaveCanvus,&dc,nStartX,nStartY);;
 }
}
//图像颜色反相处理
void InvertImage(CImage *pNewImage,CImage *pOldImage)
{
 int nBitsPerPixle;
 CopyImage(pNewImage,pOldImage);
 nBitsPerPixle=pOldImage->GetBPP();
 switch(nBitsPerPixle)
 {
 case 1: InvertPixels(pNewImage,1);//二值图像颜色反相,需要反相相素
    break;
 case 4:
 case 8: InvertPalette(pNewImage);//非真彩色图像颜色反相,只需修改调色板单元的数值
    break;
 case 24:InvertPixels(pNewImage,255);//真彩色图像颜色反相,需要反相相素
 break;
 }
}
//反相调色板,非真彩色图像颜色反相只需修改调色板单元的数值
void InvertPalette(CImage *pImage)
{
  RGBQUAD  ColorTabs[256];//调色板
 int      i,nTotalColorTableEntries;
 nTotalColorTableEntries=pImage->GetMaxColorTableEntries();//取调色板项数
  pImage->GetColorTable(0,nTotalColorTableEntries,ColorTabs);//取调色板数据
 for (i=0;i<nTotalColorTableEntries;i++)//非真彩色图像颜色反相只需修改调色板单元的数值
 {
  ColorTabs[i].rgbBlue =255 -ColorTabs[i].rgbBlue;
  ColorTabs[i].rgbGreen=255 -ColorTabs[i].rgbGreen;
  ColorTabs[i].rgbRed  =255 -ColorTabs[i].rgbRed;
 }
 pImage->SetColorTable(0,nTotalColorTableEntries,ColorTabs);//设置调色板
}
//反相图像相素,像素数据的三个颜色分量作相同的计算
void InvertPixels(CImage *pImage,int nMold)
{
 BYTE *pPixelLine;
 int   y,nByte,nBytesPerLine,nHeight,nWidth,nBitsPerPixel;
 nWidth=pImage->GetWidth();
 nHeight=pImage->GetHeight();
 nBitsPerPixel=pImage->GetBPP();
 //nPixelsPerLine=(nWidth*nBitsPerPixel+31)/32;
 //nBytesPerLine=nPixelsPerLine*4;
 nBytesPerLine=nWidth*(nBitsPerPixel/8);
 for (y=0; y<nHeight; y++)
 {
  pPixelLine=(BYTE*)pImage->GetPixelAddress(0,y);//得行首址
  for (nByte=0; nByte<nBytesPerLine; nByte++)
   pPixelLine[nByte] = nMold-pPixelLine[nByte];//真彩色图像像素数据的三个颜色分量作相同的计算
 }
}VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
 
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise
 
VC++.net处理图像变化 - InSun - InSuns PaRaDise

g= 0.30 r + 0.59 g + 0.11 b

真彩色图像变换时RGB3分量都取g值。
非真彩色图像的色调由调色板决定,故变换只需在调色板数据中进行
补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,