将图像与控件的背景混合在一起

时间:2016-05-28 10:16:14

标签: c# image-processing transparency gdi+ blending

我正在尝试将具有降低的不透明度的图像与控件的背景混合在一起。我正在使用的代码如下:

ColorMatrix matrix = new ColorMatrix(new float[][]{
    new float[] {1F, 0, 0, 0, 0},
    new float[] {0, 1F, 0, 0, 0},
    new float[] {0, 0, 1F, 0, 0},
    new float[] {0, 0, 0, opacity, 0}, //opacity in rage [0 1]
    new float[] {0, 0, 0, 0, 1F}});

ImageAttributes imageAttributes = new ImageAttributes();
imageAttributes.SetColorMatrix(matrix);

g.CompositingMode = CompositingMode.SourceOver;
g.CompositingQuality = CompositingQuality.HighQuality;
//g comes with the background already painted on it; img is my Bitmap
g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, imageAttributes);

速度性能良好但质量有问题,尤其是暗图像。以下两个背景图像(左)和前景(右): enter image description here 当前景使用0.9的不透明度时,在左下方生成输出。使用Photoshop和前景中90%不透明度的相同图像会产生更一致的结果(右图)。 enter image description here

我做错了什么或只是ImageAttribute方法的限制?如果问题是我正在使用的方法,你能否提出仍在考虑表现的替代方案?也许,替代方案还应该考虑我已经收到已经在Graphics对象上绘制的背景。

修改 为了说清楚,问题是在90%的不透明度下,图像的暗部分(仅有那些!)太透明了。如果这可以适用于任何颜色,那么我可以将一个因子应用于不透明度值,但是使用浅色可以使用(参见灯泡),而使用深色则不会。

1 个答案:

答案 0 :(得分:0)

您是否尝试过CompositingQuality.GammaCorrected?它看起来好像合成没有经过伽马校正。

您可能还希望尝试使用ImageAttributes.SetGamma方法。