MFC CImage alpha混合出错
问题描述:
我必须在图片控件上呈现图片,这些图片是两个PNG文件的组合,其中顶部图像在某些位置上具有透明像素。 plotter.pngMFC CImage alpha混合出错
与bar.png
重叠在其顶部出现的
结果应(注意栏上的怪白色轮廓):
,但它应该是:
我为它做的代码是简单
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 Bitmap和BLENDFUNCTION 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
线前,我已经得到了仍然不能令人满意:(
所以,我怎样才能得到正确组成的图像?
答
几天后和夜间绝望,我终于找到了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;
}
}
现在显示的图像组成很好。
请确保您的PNG文件是24位的,因为8位PNG不支持透明度。 – l33t