首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MFC CImageα混合出错

MFC CImageα混合出错
EN

Stack Overflow用户
提问于 2017-04-03 11:45:11
回答 1查看 1.3K关注 0票数 1

我必须在一个图片控件上显示图像,该控件是两个PNG文件的组合,其中顶部图像在某些位置具有透明像素。

plotter.png的结果

用bar.png

顶部的重叠显示为(注意栏上奇怪的白色轮廓):

但应该是:

我为它编写的代码很简单,因为

代码语言:javascript
复制
    CImage image;
    if (FAILED(image.Load(L"plotter.png")))
        return false;

    CImage imageBar;
    if (FAILED(imageBar.Load(L"bar.png")))
        return false;

    imageBar.AlphaBlend(image.GetDC(), CPoint());
    image.ReleaseDC();


    ((CStatic*)GetDlgItem(IDC_PICTURE))->SetBitmap(image);

我阅读了阿尔法混合位图BLENDFUNCTION结构上的MSDN文档,并做了一些实验。一个细节让我盯着我引用的课文:

当位图有一个阿尔法通道(即每像素α)时,设置此标志.请注意,API使用预乘alpha,这意味着位图中的红色、绿色和蓝色通道值必须与alpha通道值进行预乘。例如,如果alpha通道值为x,则红色、绿色和蓝色通道必须乘以x,并在调用之前除以0xff。

Alphablend使用预乘α,这意味着加载后,我必须转到位图上,并将每个像素乘以自己的alpha。所以我试着

代码语言:javascript
复制
for (int i = 0; i < imageBar.GetWidth(); i++)
{
    for (int j = 0; j < imageBar.GetHeight(); j++)
    {
        BYTE* ptr = (BYTE*) imageBar.GetPixelAddress(i, j);
        ptr[0] = (ptr[0] * ptr[3]) / 255;
        ptr[1] = (ptr[1] * ptr[3]) / 255;
        ptr[2] = (ptr[2] * ptr[3]) / 255;
    }
}

AlphaBlend之前和我得到的仍然是不满意的:

那么,我如何才能得到一个正确的合成图像呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-03 11:45:11

经过几天和一夜的绝望之后,我终于找到了一个类似于我尝试过的解决方案,但是在每个像素上增加了127个http://forums.codeguru.com/showthread.php?420631-setting-CImage-alpha-values&p=1560260#post1560260,这是一个有用的东西,但当时我还没有理解,也没有努力去理解它。因此,在AlphaBlend行之前,现在有:

代码语言:javascript
复制
for (int i = 0; i < imageBar.GetWidth(); i++)
{
    for (int j = 0; j < imageBar.GetHeight(); j++)
    {
        BYTE* ptr = (BYTE*)imageBar.GetPixelAddress(i, j);
        ptr[0] = ((ptr[0] * ptr[3]) + 127) / 255;
        ptr[1] = ((ptr[1] * ptr[3]) + 127) / 255;
        ptr[2] = ((ptr[2] * ptr[3]) + 127) / 255;
    }
}

现在所显示的图像很好地组成了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43183799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档