gpt4 book ai didi

windows - 使用GDI+绘制PixelFormat32bppPARGB图像使用常规公式而不是预乘公式

转载 作者:可可西里 更新时间:2023-11-01 10:37:03 31 4
gpt4 key购买 nike

这里是一些显示问题的最小代码:

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

结果,我得到的图像由等于 10 的 RGB 值填充。看来 GDI+ 使用的是常规算法:

255*(10/255) + 0*(1-10/255) == 10.

但我希望使用预乘算法(因为前景图像具有预乘 PixelFormat32bppPARGB 格式):

255 + 0*(1-10/255) == 255

那么我的问题是,当图像为预乘 alpha 格式时,为什么 GDI+ 使用常规公式?是否有任何解决方法可以使 GDI+ 使用预乘 alpha 算法?

最佳答案

前景图像的格式无关紧要(假定它具有 alpha),因为您将其设置为 Gdiplus::Color。颜色值被定义为非预乘,因此 gdiplus 在清除前景图像时会将分量乘以 alpha 值。另一种方法是让 Color 值根据渲染目标的格式具有不同的含义,这种方式很疯狂。

您可能可以通过直接设置源图像位来完成您想要的操作,也可能不会。值大于 100% 的组件在 gdiplus 的渲染模型中不是真正有效的,所以如果它在渲染期间限制它们,我不会感到惊讶。如果你真的想要这种级别的渲染控制,你必须锁定位图位并自己完成。

关于windows - 使用GDI+绘制PixelFormat32bppPARGB图像使用常规公式而不是预乘公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19809506/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com