您的位置:首页 > 编程语言 > C语言/C++

【C++】使用CImage类将彩色图像转换成8位灰色图像

2015-04-20 16:53 288 查看
BOOL ImageToGray(CImage& imgSrc,CImage& imgDst)
{
int width = imgSrc.GetWidth();
int height = imgSrc.GetHeight();

if (!imgDst.IsNull())
{
imgDst.Destroy();
}
imgDst.Create(width,height,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<width;i++)
{
for(int j=0;j<height;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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: