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的留邮箱。
最简单的色调变换是颜色反相和彩色图像变黑白
颜色反相:
真彩色图像的3个颜色分量都需进行这样的运算(g=Max-f)
非真彩色图像只需修改调色板单元的数值
真彩色图像的3个颜色分量都需进行这样的运算(g=Max-f)
非真彩色图像只需修改调色板单元的数值
//====================颜色反相处理==================
//菜单:图像变化/色调变化:颜色反相
void CImageView::OnInvertColor()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
int nStartX,nStartY,nCanvusDrawWidth;
//菜单:图像变化/色调变化:颜色反相
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;
{
//显示工作画布
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;
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;
break;
}
}
//反相调色板,非真彩色图像颜色反相只需修改调色板单元的数值
void InvertPalette(CImage *pImage)
{
RGBQUAD ColorTabs[256];//调色板
int i,nTotalColorTableEntries;
nTotalColorTableEntries=pImage->GetMaxColorTableEntries();//取调色板项数
pImage->GetColorTable(0,nTotalColorTableEntries,ColorTabs);//取调色板数据
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;
{
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);
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];//真彩色图像像素数据的三个颜色分量作相同的计算
}
}
{
pPixelLine=(BYTE*)pImage->GetPixelAddress(0,y);//得行首址
for (nByte=0; nByte<nBytesPerLine; nByte++)
pPixelLine[nByte] = nMold-pPixelLine[nByte];//真彩色图像像素数据的三个颜色分量作相同的计算
}
}
g= 0.30 r + 0.59 g + 0.11 b
真彩色图像变换时RGB3分量都取g值。
非真彩色图像的色调由调色板决定,故变换只需在调色板数据中进行
补充:软件开发 , Vc ,
上一个:3389后门自己造
下一个:VC++下编译出极小的程序
- 更多VC++疑问解答:
- VC++ 算法。
- MFC CListCtrl获取列数出错了,怎么回事?
- 谁有VC++6.0企业版中文版的下载地址
- vc++,关于TextOut的一个小问题
- 定义一个三维的CStringArray//一定要使用CArray模板?那操作的时候,使用那个类的函数对数组进行操作呢?
- 关于mfc消息映射的问题
- MFC中用TextOut输出的问题
- 请问如何在VC6.0里MFC下对万年历进行编程
- iArray.Add(iValue);//Add函数的参数不可以用CArray模板???
- 'USES_CONVERSION' : undeclared identifier;'A2W' : undeclared identifier
- vc6.0能不能用CImage,能的话给个例子,以及atlimage.h,
- VC 对话框 标题栏 怎么变成这个样子????如图!
- spin控件的UDN_DELTAPOS消息//下面代码什么作用? [
- VC修改DNF
- vc 套接字 struct