将ARGB转换为RGB而不丢失信息

6
我想将一个ARGB值转换成RGB值,而不会失去它从背景中获取的信息。 例如:背景是黑色,ARGB是(150,255,0,0),结果我希望得到一种棕色。 有没有办法解决这个问题?
2个回答

10
    public static Color RemoveAlpha(Color foreground, Color background)
    {
        if (foreground.A == 255)
            return foreground;

        var alpha = foreground.A / 255.0;
        var diff = 1.0 - alpha;
        return Color.FromArgb(255,
            (byte)(foreground.R * alpha + background.R * diff),
            (byte)(foreground.G * alpha + background.G * diff),
            (byte)(foreground.B * alpha + background.B * diff));
    }

来自http://mytoolkit.codeplex.com/SourceControl/latest#Shared/Utilities/ColorUtility.cs的源代码:


7

您可以进行计算

foreground * alpha + background * (1-alpha)

将红色、绿色和蓝色通道的新颜色设为您的目标。请注意,我在表达式中使用了一个范围从 01alpha


你可以拿我的例子来解释吗?我无法想象我应该如何从这个方程式中得到3个值。谢谢。 - roqstr
这是否同样适用于 C# 中的“预乘”和“直接”格式(PixelFormat.Alpha vs PixelFormat.PAlpha)? 我猜预乘意味着我们应该省略第一次与 alpha 的乘法? 但这并没有多少意义,因为每个通道都需要超过一个字节(或短字符)来保存相同的数据...那么预乘格式只是这样做吗? - Louis Somers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接