Author:Insun
From:
www.4safer.com
Programming Environment :winXP &VC++.net 2003(虽然有05和2010试用版,还是钟爱03)
最简单的色调变换是颜色反相和彩色图像变黑白
颜色反相:
真彩色图像的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非真彩色图像颜色反相只需修改调色板单元的数值
{
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 {
pPixelLine=(BYTE*)pImage->GetPixelAddress(0,y);// 得行首址
for (nByte=0; nByte pPixelLine[nByte] = nMold-pPixelLine[nByte];//
真彩色图像像素数据的三个颜色分量作相同的计算
}
}
pPixelLine=(BYTE*)pImage->GetPixelAddress(0,y);// 得行首址
for (nByte=0; nByte
}
}
g= 0.30 r + 0.59 g + 0.11 b
真彩色图像变换时RGB3分量都取g值。
非真彩色图像的色调由调色板决定,故变换只需在调色板数据中进行