【问题标题】:Convert Color from non-premultiplied alpha to premultiplied alpha将颜色从非预乘 alpha 转换为预乘 alpha
【发布时间】:2014-09-16 11:00:48
【问题描述】:

是 .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 分量之外,预乘 alpha 分量是否正确?

【问题讨论】:

  • 根据this article 是不正确的。
  • 如果您指的是System.Drawing.PixelFormat,例如Format32bppPArgb,在线文档说 the red, green, and blue components are premultiplied, according to the alpha component,但不是 alpha 组件本身。

标签: c# colors


【解决方案1】:

正如 Clemens 所提到的 - 不要划分 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); 
}

【讨论】:

  • 我的代码不能溢出; byte.MaxValue*byte.MaxValue 可以容纳 32 位有符号/无符号,除以 byte.MaxValue 可以容纳 8 位无符号。
  • 猜猜我还住在 C.
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2011-09-29
  • 2016-12-28
  • 2018-03-30
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
相关资源
最近更新 更多