利用CImage合并两张图片后保存

来源:互联网 发布:淘宝怎么给商品打折 编辑:程序博客网 时间:2024/06/05 04:21

今天同事那边遇到了一个问题,希望将一个不透明的图片,贴在一透明的PNG上。

想着应该比较简单,直接贴过去就可以了。在实践过程中,发现图片贴过去后,PNG的Alpha通道会丢失。

经过实验,发现是CImage的Attach与Detach接口造成。

CImage类提供了GetDC的接口,使用自带的GetDC接口解决了丢失的问题。但是贴过去后,不透明的图片区域变成了完全透明。

经过排查发现是两张图片的位深不同造成的。因此,在两者位深不同时需要进行一个简单的转换。

还是值得记一个这个问题

下面贴一下代码

    CImage bk, fr, temp;    bk.Load(L"D:/bk.png");    fr.Load(L"D:/fr.png");    int bppFr = fr.GetBPP();    int bppBk = bk.GetBPP();    if (bppFr != 32) {        temp.Create(fr.GetWidth(), fr.GetHeight(), 32, CImage::createAlphaChannel);        for (auto x = 0; x < fr.GetWidth(); ++x) {            for (auto y = 0; y < fr.GetHeight(); ++y) {                byte* pSour = (byte*)fr.GetPixelAddress(x, y);                byte* pDest = (byte*)temp.GetPixelAddress(x, y);                pDest[0] = pSour[0];                pDest[1] = pSour[1];                pDest[2] = pSour[2];                             pDest[3] = 0xFF;            }        }    }        RECT rcDest = { 0, 0, fr.GetWidth(), fr.GetWidth() };    if (!temp.IsNull()) {        temp.Draw(bk.GetDC(), rcDest);    }    else {        fr.Draw(bk.GetDC(), rcDest);    }    bk.Save(L"d:/dest.png", ImageFormatPNG); 


原创粉丝点击