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

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/221990

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午11:31
下一篇 2023年2月13日 上午11:31

相关推荐