使用CImage类将RGB图像转化为灰度图像

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/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值