Some video editing and rapid development tools contain a transition called gradient wipe. A gradient wipe animates image A changing into image B based on a mask. Where the mask has high values, the transition is rapid. Where the mask has low values, the transition is slow. A typical gradient wipe uses a linear gradient as a mask, causing a wiping effect across the images as they change, or a radial gradient, causing image B to reveal from the center of image A.
Theres a lot of room for creativity in this arrangement, particularly in what image is used for the mask. For instance, if you use image A for the mask, the transition occurs first in the dark (or light) portions of image A. The mask can be a swirl or a zigzag pattern. Image A and image B can be negative versions of each other. The mask can be one channel of image B.
In this first example, I used text of varying values in the mask to reveal the letters one at a time.
Here I use a tri-layered cityscape to reveal the underimage.
This last example causes the circular features of image B to appear first, followed by the background features.
The Wolfram Language code below creates a gradient wipe. Load whatever .jpg images you want into overImg, maskImg, and underImg. Heres what the code does:
- Resizes all three images to 400 × 300 (change for your needs)
- Pulls the lightness channel from the mask image
- Makes a series of frames from white to black based on the mask
- Replaces the alpha data in the top image with each of the frames
- Composes the series of top images (now with alpha) to the bottom image
Outputs an animation (change for your needs)
overImg = Image[, ImageSize -> {400, 300}];
underImg = Image[, ImageSize -> {400, 300}];
maskImg = Image[, ImageSize -> {400, 300}];
mask = Image[ColorSeparate[maskImg, "L"]];
frames = Table[ImageAdjust[mask, {.35, 0, b}], {b, Table[10^n, {n, -1.5, 1.5, .15}]}];
picData = ImageData[overImg];
outData = (MapThread[({#1[[1]], #1[[2]], #1[[3]], #2}) &, {picData, ImageData[#]}, 2]) & /@ frames;
picOut = Flatten[Append[Prepend[ImageCompose[underImg,Image[#, ColorSpace -> "RGB", ImageSize -> 400]] & /@ outData, Table[overImg, 3]], Table[underImg, 3]]];
ListAnimate[picOut]
Enjoy,
Mark Greenberg