CImage灰度化

BOOL ImageToGray(const 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字节

    //为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);

    //获取指向图像数据的指针
    //GetBits 与 GetPitch 关系:
    //当GetPitch()<0时,GetBits()获得的指针指向最后一行
    //当GetPitch()>0时,GetBits()获得的指针指向第一行

    byte* pDataDst = NULL;
    byte* pDataSrc = NULL;

    if (imgDst.GetPitch() < 0)
        pDataDst = (BYTE*)imgDst.GetBits() + (imgDst.GetPitch()*(imgDst.GetHeight() - 1));
    else
        pDataDst = (BYTE*)imgDst.GetBits();

    if (imgSrc.GetPitch() < 0)
        pDataSrc = (BYTE*)imgSrc.GetBits() + (imgSrc.GetPitch()*(imgSrc.GetHeight() - 1));
    else
        pDataSrc = (BYTE*)imgSrc.GetBits();



    //获取每行图像占用的字节数
    int pitchSrc = abs(imgSrc.GetPitch());
    int pitchDst = abs(imgDst.GetPitch());

    // 获取每个像素占用的字节数
    int bitCountSrc = imgSrc.GetBPP() / 8;

    if (bitCountSrc == 1)
    {
        imgDst = imgSrc;
        return TRUE;
    }

    if ((bitCountSrc != 3) && (bitCountSrc != 4))
        return FALSE;


    byte tmpR, tmpG, tmpB;
    int temGray;

    for (int i = 0; i < maxY; i++)
    {
        for (int j = 0; j < maxX; j++)
        {
            byte * ptmpSrc = pDataSrc + pitchSrc*i + j*bitCountSrc;
            tmpB = *ptmpSrc++;
            tmpG = *ptmpSrc++;
            tmpR = *ptmpSrc;

            temGray = (tmpR * 19595 + tmpG * 38469 + tmpB * 7472) >> 16;
            *(pDataDst + pitchDst*i + j) = temGray;
        }
    }

    return TRUE;
}

 

转载于:https://www.cnblogs.com/nkzhangkun/p/4816185.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值