【发布时间】:2013-11-06 10:24:37
【问题描述】:
这里有一些显示问题的最小代码:
static const int MAX_WIDTH = 320;
static const int MAX_HEIGHT = 320;
Gdiplus::Bitmap foregroundImg(MAX_WIDTH,MAX_HEIGHT,PixelFormat32bppPARGB);
{
Gdiplus::Graphics g(&foregroundImg);
g.Clear(Gdiplus::Color(10,255,255,255));
}
Gdiplus::Bitmap softwareBitmap(MAX_WIDTH,MAX_HEIGHT,PixelFormat32bppPARGB);
Gdiplus::Graphics g(&softwareBitmap);
g.SetCompositingMode(Gdiplus::CompositingModeSourceOver);
g.SetCompositingQuality(Gdiplus::CompositingQualityDefault);
g.Clear(Gdiplus::Color(255,0,0,0));
g.DrawImage(foregroundImg,0,0);
CLSID encoder;
GetEncoderClsid(L"image/png",&encoder);
softwareBitmap.Save(L"d:\\image.png",&encoder);
结果我得到的图像填充的 RGB 值等于10。看来 GDI+ 使用的是常规算法:
255*(10/255) + 0*(1-10/255) == 10。
但我希望会使用预乘算法(因为前景图像具有预乘PixelFormat32bppPARGB 格式):
255 + 0*(1-10/255) == 255
所以我的问题是,当图像为预乘 alpha 格式时,为什么 GDI+ 使用传统公式?是否有任何解决方法可以让 GDI+ 使用预乘 alpha 算法?
【问题讨论】:
-
源位图和目标位图都是 PARGB。因此无需更改像素,您将获得foregroundImg 的精确副本。
-
不,我没有得到前景图像的副本。我得到的图像充满了 ARGB(255,10,10,10),这正是传统算法产生的。顺便说一句,我尝试了各种背景格式,但结果总是一样