提问人:Spook 提问时间:10/28/2023 更新时间:10/28/2023 访问量:13
int 颜色的 Alpha 混合超出字节范围
Alpha blending on int colors exceeds byte ranges
问:
我已经实现了一种用于 alpha 混合的算法。它工作了一段时间,但很快我就注意到在某些特定情况下我收到了一些奇怪的结果。
我进行了调查,结果发现该算法产生的颜色值大于 255。我编写了一个应用程序来检查颜色/alpha 源/目标值的哪些组合导致了问题:
class Program
{
static void Main(string[] args)
{
var parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 16;
Parallel.For(0, 256, parallelOptions, bA =>
{
Console.WriteLine($"bA: {bA}...");
for (int tA = 0; tA < 256; tA++)
{
for (int bR = 0; bR < 256; bR++)
for (int tR = 0; tR < 256; tR++)
{
int a = (((bA + tA) * 255) - tA * bA) / 255;
if (a > 0)
{
var R = ((255u - tA) * bA * bR / 255 + tA * tR) / a;
if (R > 255)
{
Console.WriteLine($"{bA}, {bR}, {tA}, {tR} => {R}");
}
}
}
}
});
Console.ReadKey();
}
}
结果是直立的可怕的,例如(bA = 碱基 alpha,bR = 碱基红色,tA = 目标 alpha,tR = 目标红):
bA, bR, tA, tR => R
1, 58, 1, 255 => 312
有趣的是,当用浮点算术代替 int 时,结果永远不会超过 256(它们确实超过 255,但我猜是因为浮点算术问题)。
我试图以这样的方式转换公式,即除法(这似乎是四舍五入错误的第一个疑点)总是在计算的末尾,但这并没有太大帮助 - 我总是最终得到超过 255 的结果。
为什么?有没有办法修复公式,这样我就不会收到超过 255 的值?
答: 暂无答案
上一个:3D 对象定位到 2D 图像
下一个:转换浮点数时出现问题
评论
(((bA + tA) * 255) - tA * bA) / 255
(((1 + 1) * 255) - 1 * 1) / 255 = ((2*255) - 1) / 255 = 509/255