MFC CImage alpha混合出错

问题描述:

我必须在图片控件上呈现图片,这些图片是两个PNG文件的组合,其中顶部图像在某些位置上具有透明像素。 plotter.pngMFC CImage alpha混合出错

enter image description here

与bar.png

enter image description here

重叠在其顶部出现的

结果应(注意栏上的怪白色轮廓):

enter image description here

,但它应该是:

enter image description here

我为它做的代码是简单

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

我已经阅读Alpha Blending a BitmapBLENDFUNCTION structure MSDN文档,并做了一些实验。的细节使我盯在我引述文本:

当位图具有alpha通道(即, 每像素阿尔法)该标志被设置。请注意,这些API使用预乘alpha,其中 表示位图中的红色,绿色和蓝色通道值必须与Alpha通道值预乘 。例如,如果 alpha通道值为x,则红色,绿色和蓝色通道必须在调用之前乘以x并除以0xff,即 。

Alphablend使用预乘alpha,装载我去的位图和自己的阿尔法乘的每一个像素之后,这意味着。所以,我想

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线前,我已经得到了仍然不能令人满意:(

所以,我怎样才能得到正确组成的图像?

+0

请确保您的PNG文件是24位的,因为8位PNG不支持透明度。 – l33t

几天后和夜间绝望,我终于找到了http://forums.codeguru.com/showthread.php?420631-setting-CImage-alpha-values&p=1560260#post1560260这是一种类似于我所尝试的解决方案,但与增加了127到每个像素,这是一个工作,但我没有理解的时候,我也没有已经尽力了解它,所以在之前10行现在有:

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

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