我正在尝试将具有降低的不透明度的图像与控件的背景混合在一起。我正在使用的代码如下:
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);
速度性能良好但质量有问题,尤其是暗图像。以下两个背景图像(左)和前景(右): 当前景使用0.9的不透明度时,在左下方生成输出。使用Photoshop和前景中90%不透明度的相同图像会产生更一致的结果(右图)。
我做错了什么或只是ImageAttribute
方法的限制?如果问题是我正在使用的方法,你能否提出仍在考虑表现的替代方案?也许,替代方案还应该考虑我已经收到已经在Graphics
对象上绘制的背景。
修改 为了说清楚,问题是在90%的不透明度下,图像的暗部分(仅有那些!)太透明了。如果这可以适用于任何颜色,那么我可以将一个因子应用于不透明度值,但是使用浅色可以使用(参见灯泡),而使用深色则不会。
答案 0 :(得分:0)
您是否尝试过CompositingQuality.GammaCorrected?它看起来好像合成没有经过伽马校正。
您可能还希望尝试使用ImageAttributes.SetGamma方法。