C# 透明区域上的暗像素

C# 透明区域上的暗像素,c#,gdi+,C#,Gdi+,我在使用系统时遇到困难。在C#中绘制错误。我已经试着诊断了5个月了 我的程序基本上做photoshop画笔。下面的示例。 它适用于绝对不透明的图像。但是,如果图像有任何透明度,它开始导致奇怪的错误。考虑一下。 每一行上的灰色边框,在第二张图片中高度可见,是一个阿尔法伪影。如果我画在同一个区域上,我可以得到像RGB中的(127127127)一样暗的颜色,这是完美的灰色,我不认为这是巧合 打开/关闭对话框、撤消/重做以及在透明区域上绘图时会发生此错误 无论如何,我很想得到帮助来解决这个GDI+问

我在使用系统时遇到困难。在C#中绘制错误。我已经试着诊断了5个月了

我的程序基本上做photoshop画笔。下面的示例。

它适用于绝对不透明的图像。但是,如果图像有任何透明度,它开始导致奇怪的错误。考虑一下。

每一行上的灰色边框,在第二张图片中高度可见,是一个阿尔法伪影。如果我画在同一个区域上,我可以得到像RGB中的(127127127)一样暗的颜色,这是完美的灰色,我不认为这是巧合

打开/关闭对话框、撤消/重做以及在透明区域上绘图时会发生此错误

无论如何,我很想得到帮助来解决这个GDI+问题。我来过这里:






可能性:存在一个边界错误,在该错误中,调整大小的图像包括图像外部的像素,这些像素假定为黑色,并且它们参与了计算(导致边界变黑)

但这并不能解释在源上复制和写入图像是如何产生这种效果的

可能性:创建一个新位图会自动将每个像素按其alpha进行预乘

我已经尝试过一种经过测试的解决方法,锁定位并将其复制(以避免乘以alpha),但这并不能解决我的问题

我已经尝试了这里介绍的所有解决方案,我总结如下:

InterpolationMode.NearestNeighbor、SmoothingMode.None和PixelOffsetMode.Half的任意组合

用透明色、彩色.白色和彩色.黑色清除,以及上述尝试

克隆位图的变通方法,有时与上述其他变通方法结合使用

使用ImageAttributes对象并将WrapMode设置为TileFlipXY,有时与上述解决方法结合使用

使用Color.convertFromPremultipledAlpha和Color.convertToPremultipledAlpha,效果肯定不好

,包括所有相关代码。

在我最初的非现场帖子上有一点。

为了更好地控制混合和alpha混合,我不喜欢使用DrawImage进行笔刷绘制,而是使用LockiBits解决方案。谢谢,但不幸的是,我已经尝试过了。在第二个区块报价下。此外,所谓测试,我的意思是它可以正确地复制位,但问题也依然存在。因为它允许您对每个通道的位和字节执行任何操作,当然,如果操作正确,它肯定能够提供帮助。。让阿尔法“正确”在我看来是不可能的,因为有相当多的模式,人们可以希望和noe可以被视为“自然的一个”。。到目前为止(我在这里谈论的是几年),我记得我必须计算每一个,因为内置的混合没有做任何我需要的5-10混合模式。