Make a Contact Sheet Before Adding Motion
Imagine a bakery preparing a short cake video.
The team has twelve possible starting images. Most look almost identical in a folder, so someone picks one quickly. Only after adding motion do they notice a missing candle, a different plate, and broken text on the sign behind the cake.
The motion is not the main problem. The wrong image entered a workflow that might continue in PWZ AI or another creative workspace. A numbered contact sheet would have made the differences easier to spot before animation began.
Why a Folder Is Not Enough
Opening files one at a time makes visual comparison difficult. Names such as download-7.png and final-new-2.png are not much help.
A contact sheet places every option on one page. It makes four things easier to compare:
- Subject and product details
- Background consistency
- Space for movement and captions
- Broken text or unwanted objects
The most attractive still image is not always the best starting frame. A close crop may look good on its own but leave no room for a hand to enter or for the camera to move.
Create a Contact Sheet With Pillow
Place the images in a folder named candidates, then run this script:
from pathlib import Path
from PIL import Image, ImageDraw, ImageOps
folder = Path("candidates")
extensions = {".png", ".jpg", ".jpeg", ".webp"}
files = sorted(
path for path in folder.iterdir()
if path.suffix.lower() in extensions
)
if not files:
raise SystemExit("No images found in the candidates folder.")
columns = 4
cell_width = 320
cell_height = 240
label_height = 32
rows = (len(files) + columns - 1) // columns
sheet = Image.new(
"RGB",
(columns * cell_width, rows * (cell_height + label_height)),
"white"
)
draw = ImageDraw.Draw(sheet)
for index, path in enumerate(files):
with Image.open(path) as source:
image = ImageOps.exif_transpose(source).convert("RGB")
thumbnail = ImageOps.contain(
image,
(cell_width, cell_height)
)
column = index % columns
row = index // columns
x = column * cell_width
y = row * (cell_height + label_height)
image_x = x + (cell_width - thumbnail.width) // 2
image_y = y + (cell_height - thumbnail.height) // 2
sheet.paste(thumbnail, (image_x, image_y))
draw.text(
(x + 8, y + cell_height + 8),
f"{index + 1:02d} {path.name}",
fill="black"
)
sheet.save("contact-sheet.jpg", quality=90)
Install Pillow if needed:
pip install pillow
ImageOps.exif_transpose() applies the orientation stored by phones and cameras. Without it, some images may appear rotated in the finished sheet.
Choose for Movement, Not Just Appearance
Suppose image 04 has the warmest lighting, but the cake is already cropped at the edge. Image 07 looks simpler, yet it shows the full plate and leaves room above the candles.
Image 07 may be the better starting frame because it gives the next action somewhere to happen.
Record the decision in a small table:
| Candidate | Decision | Reason |
|---|---|---|
| 04 | Reject | Cake is cropped too closely |
| 07 | Select | Clear shape and room for movement |
| 09 | Reject | Background sign contains broken text |
| 11 | Backup | Good layout, but one candle is missing |
Rename the selected file clearly:
cake-shot-01-selected.png
Do not replace it later with another image under the same filename. That makes previous review notes unreliable.
Animate Only the Shortlist
There is little value in animating all twelve candidates. Select two or three, then give each the same simple movement:
Slow push toward the cake. Let the candle flames move gently. Keep the cake, plate, background, and camera direction stable.
Using one movement makes the comparison fair. If every image receives different instructions, it becomes harder to tell whether the starting frame or the motion caused the problem.
Check the result for changing product shapes, distorted text, missing objects, and camera movement that exposes unfinished parts of the background. Timing can often be fixed in an editor. Major changes to the subject may require another draft.
Share the Sheet Carefully
A contact sheet is easy to share, which also makes it easy to expose material that should remain private.
Do not include confidential client work, private locations, unreleased products, or identifiable people unless their use has been approved. Confirm that reference images, characters, and logos can be processed and published for the intended purpose.
Generated prices, labels, and product details should be checked independently. A convincing image does not make the information inside it accurate.
The bakery does not need twelve animated cakes. It needs one starting frame chosen carefully.
Make the contact sheet first.
All rights reserved