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

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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值