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