将.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分量之外,预先计算α分量是否正确?
答案 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);
}