这是一些显示问题的最小代码:
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 算法?