C# 将颜色从非预乘alpha转换为预乘alpha

C# 将颜色从非预乘alpha转换为预乘alpha,c#,colors,C#,Colors,是.NETColorstruct从非预乘alpha到预乘alpha的转换: public static Color PremultiplyAlpha(Color pixel) { return Color.FromArgb( PremultiplyAlpha_Component(pixel.A, pixel.A), PremultiplyAlpha_Component(pixel.R, pixel.A), PremultiplyAlpha_

是.NET
Color
struct从非预乘alpha到预乘alpha的转换:

public static Color PremultiplyAlpha(Color pixel) {
    return Color.FromArgb(
        PremultiplyAlpha_Component(pixel.A, pixel.A),
        PremultiplyAlpha_Component(pixel.R, pixel.A),
        PremultiplyAlpha_Component(pixel.G, pixel.A),
        PremultiplyAlpha_Component(pixel.B, pixel.A));
}
private static byte PremultiplyAlpha_Component(byte source, byte alpha) { 
    return (byte)((source * alpha) / byte.MaxValue); 
}

特别是,除了RGB分量外,对alpha分量进行预乘是否正确?

正如克莱门斯所提到的,不要对alpha进行除法。同时,你在计算中也失去了一些准确性。更不用说字节将溢出。使用浮动。然后,当转换为字节时,添加0.5以获得正确的舍入。或者使用内置的圆形

public static Color PremultiplyAlpha(Color pixel) {
    return Color.FromArgb(
        pixel.A,
        PremultiplyAlpha_Component(pixel.R, pixel.A),
        PremultiplyAlpha_Component(pixel.G, pixel.A),
        PremultiplyAlpha_Component(pixel.B, pixel.A));
}
private static byte PremultiplyAlpha_Component(byte source, byte alpha) { 
    return (byte)(float(source) * float(alpha) / float(byte.MaxValue) + 0.5f); 
}

根据它是不正确的。如果你指的是
系统.Drawing.PixelFormat
,比如
Format32bppPArgb
,在线文档说
红、绿、蓝三个分量是预乘的,根据alpha分量
,而不是alpha分量本身。我的代码不能溢出
byte.MaxValue*byte.MaxValue
可以容纳32位有符号/无符号,除以
byte.MaxValue
可以容纳8位无符号。我想我还是住在C。