T图像中的灰度值表示时间偏移。你擦的效果将基本上如下工作,在每个像素的基础:
for (timeIndex from 0 to 255)
{
for (each pixel)
{
if (timeIndex < T.valueOf[pixel])
{
compositeImage.colorOf[pixel] = A.colorOf[pixel];
}
else
{
compositeImage.colorOf[pixel] = B.colorOf[pixel];
}
}
}
为了说明,假设在timeIndex
几个值会发生什么:
timeIndex == 0
(0%):这是转型的开始。此时,合成图像中的大部分像素将是图像A的像素,除非T中的对应像素完全是黑色。在这些情况下,合成图像像素将是图像B的像素。
timeIndex == 63
(25%):在这一点上,来自图像B的更多像素已经使其进入合成图像。 T的值小于25%的每个像素将从图像B中获取,其余的仍然是图像A.
timeIndex == 255
(100%):此时,T中的每个像素都将否定条件,所以所有的合成图像中的像素的将是那些图像B.
以“平滑”过渡的,你可以做到以下几点:
for (timeIndex from 0 to (255 + fadeTime))
{
for (each pixel)
{
blendingRatio = edgeFunction(timeIndex, T.valueOf[pixel], fadeTime);
compositeImage.colorOf[pixel] =
(1.0 - blendingRatio) * A.colorOf[pixel] +
blendingRatio * B.colorOf[pixel];
}
}
edgeFunction
的选择取决于你。这一个产生从A到B的线性转变:
float edgeFunction(value, threshold, duration)
{
if (value < threshold) { return 0.0; }
if (value >= (threshold + duration)) { return 1.0; }
// simple linear transition:
return (value - threshold)/duration;
}
恭喜!预先计算混合比率并使用直接位图操作,可以使您的方法更快速。 – Kawa 2009-11-09 17:03:24
很高兴听到它:) – 2009-11-09 17:13:59
并感谢您发布您的最终代码。很高兴看到这样的答案得到付诸实践,现在其他人可以从你所做的改进中学习。干杯! – 2009-11-09 17:16:58