我必须在图片控件上呈现图片,这些图片是两个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
线前,我已经得到了仍然不能令人满意:(
所以,我怎样才能得到正确组成的图像?
请确保您的PNG文件是24位的,因为8位PNG不支持透明度。 – l33t