我试图将图像和减少的不透明度与控件的背景混合在一起。我使用的代码如下:
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%的不透明度的黑暗部分(只有那些!)图像太透明了。如果这对任何颜色都适用,那么我就可以将一个因素应用到不透明度值上,但是对于光颜色,它可以工作(见灯泡),而在黑暗中,它不工作。
发布于 2016-06-07 08:36:52
你试过CompositingQuality.GammaCorrected了吗?在我看来,合成似乎没有得到伽马校正。
您还可以尝试使用ImageAttributes.SetGamma方法。
https://stackoverflow.com/questions/37497769
复制