C# 将颜色从非预乘alpha转换为预乘alpha
是.NETC# 将颜色从非预乘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_
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。