Author:Insun
Programming Environment :winXP &VC++.net 2003(虽然有05和2010试用版,还是钟爱03)
为了方便,借用老king(金登男)的ppt直接另存导出JPEG格式图片讲解。【Visual
C++.NET图像处理
编程(附光盘)/陆宗骐/金登男】
老king给我们讲解Visual C++.NET图像处理编程时候蛮好的,犀利的,那本书是陆宗骐合编的,记得陆宗骐曾自己独编C++图像处理编程,都是差不多。索取ppt的留邮箱。
最简单的色调变换是颜色反相和彩色图像变黑白
颜色反相:
真彩色图像的3个颜色分量都需进行这样的运算(g=Max-f)
非真彩色图像只需修改调色板单元的数值
//====================颜色反相处理==================
//菜单:图像变化/色调变化:颜色反相
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非真彩色图像颜色反相只需修改调色板单元的数值
{
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
{
pPixelLine=(BYTE*)pImage->GetPixelAddress(0,y);//
得行首址
for (nByte=0; nByte
pPixelLine[nByte] = nMold-pPixelLine[nByte];//
真彩色图像像素数据的三个颜色分量作相同的计算
}
}
g= 0.30 r + 0.59 g + 0.11 b
真彩色图像变换时RGB3分量都取g值。
非真彩色图像的色调由调色板决定,故变换只需在调色板数据中进行