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

时间:2014-09-16 11:00:48

标签: c# colors

将.NET Color结构转换为非预乘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分量之外,预先计算α分量是否正确?

1 个答案:

答案 0 :(得分:0)

正如克莱门斯所提到的 - 不要划分阿尔法。你在计算中也失去了一些准确性。 更不用说字节会溢出。使用浮点数。然后当转换为byte时,添加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); 
}