BOOL ImageToGray(CImage& imgSrc,CImage& imgDst)
{
int maxY = imgSrc.GetHeight();
int maxX = imgSrc.GetWidth();
if (!imgDst.IsNull())
{
imgDst.Destroy();
}
imgDst.Create(maxX,maxY,8,0);//图像大小与imgSrc相同,每个像素占1字节
if(imgDst.IsNull())
return FALSE;
//为imgDst构造256阶灰度调色表
RGBQUAD ColorTab[256];
for(int i=0;i<256;i++)
{
ColorTab[i].rgbBlue = ColorTab[i].rgbGreen = ColorTab[i].rgbRed = i;
}
imgDst.SetColorTable(0,256,ColorTab);
byte* pDataSrc = (byte*)imgSrc.GetBits(); //获取指向图像数据的指针
byte* pDataDst = (byte*)imgDst.GetBits();
int pitchSrc = imgSrc.GetPitch(); //获取每行图像占用的字节数 +:top-down;-:bottom-up DIB
int pitchDst = imgDst.GetPitch();
int bitCountSrc = imgSrc.GetBPP()/8; // 获取每个像素占用的字节数
int bitCountDst = imgDst.GetBPP()/8;
if((bitCountSrc!=3)||(bitCountDst!=1))
return FALSE;
int tmpR,tmpG,tmpB,avg;
for(int i=0;i<maxX;i++)
{
for(int j=0;j<maxY;j++)
{
tmpR = *(pDataSrc+pitchSrc*j+i*bitCountSrc);
tmpG = *(pDataSrc+pitchSrc*j+i*bitCountSrc+1);
tmpB = *(pDataSrc+pitchSrc*j+i*bitCountSrc+2);
avg = (int)(tmpR+tmpG+tmpB)/3;
*(pDataDst+pitchDst*j+i*bitCountDst) = avg;
}
}
return TRUE;
}
博文出处:http://blog.163.com/yuyang_tech/blog/static/21605008320138354131378/
使用CImage类将RGB图像转化为灰度图像
最新推荐文章于 2023-07-12 20:13:05 发布