AI Polaroid or VHS photo look on your own photo: an edit call
Give a photo the Polaroid or VHS look with one reference edit instead of a filter, then draw the date stamp or caption in code so the digits are exact.

To give a photo a Polaroid or VHS look with an AI image model, send the photo as an input_references entry with model: "openai/gpt-image-2.5", describe the look in the prompt, and set aspect_ratio: "auto" so the result keeps the photo's shape. Add the date stamp, the REC counter or the handwritten caption in code afterwards.
This is a restyle, not a filter: the model redraws the picture, so people and small details can shift. Say what must stay (faces, the sign in the background) and compare against the original.
Two prompts to start from
Describe the physical artefact rather than the adjective. For a Polaroid, name the white frame with the thicker bottom edge, the slightly faded colour and the soft flash. For VHS, name tracking lines, soft chroma bleed and a 4:3 frame.
| Look | Prompt carries | Aspect ratio | Add in code |
|---|---|---|---|
| Polaroid | White instant-film frame, thick bottom border, faded warm colour | auto (or 4:5 if you want the frame to fill a portrait post) | Handwritten caption in the bottom border |
| VHS | Scan lines, tracking glitch, soft colour bleed, camcorder frame | 4:3 is in the Sume aspect list | PLAY and REC overlay, date and time |
| Disposable camera | Hard flash, red-eye-free, slight grain, light leak at one edge | auto | Orange date stamp in the corner |
The date stamp in code
Digits are the first thing a viewer reads on a retro frame, so draw them. This script runs as is: it makes a placeholder frame, draws a stamp and saves a PNG; point it at your generated image instead.
from PIL import Image, ImageDraw, ImageFont
image = Image.new("RGB", (1024, 768), (40, 40, 48)) # replace with Image.open("generated.png")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
draw.text((image.width - 220, image.height - 40), "'98 10 04", fill=(255, 140, 0), font=font)
draw.text((24, 24), "PLAY", fill=(255, 255, 255), font=font)
image.save("stamped.png")
print(image.size)The edit request
Reference URLs must be public HTTPS. If the call takes longer than the 30-second blocking budget you get 202 and a job to poll; slow configurations are the usual cause.
{
"model": "openai/gpt-image-2.5",
"prompt": "Restyle the photo as a faded instant-film Polaroid with a white frame and thicker bottom border. Keep every person and the storefront sign exactly as in the reference. Leave the bottom border blank.",
"input_references": [
{"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
],
"aspect_ratio": "auto"
}Keep the original
Store the untouched photo next to the stylised result. A look you dislike can be regenerated from the original, and a sent reference is only needed while the job runs.
Sources
Related posts
More in Use cases
- AI postcard via API: 3:2 front art, address side drawn in code
Make a postcard front at 3:2 with GPT Image 2.5 custom pixels, then draw the back with message, address lines and a stamp box in Pillow. Code runs as written.
- AI shopping referrals up 693%: a Sume output schema for listing copy
Adobe data in KTVZ has AI referrals to US retail up 693.4% in Nov-Dec 2025. Bind a headline, hero image and alt-text schema so each video returns typed JSON.
- AI vinyl sleeve art at 12 inches: gpt-image-2.5 stops at 240 dpi
A 12-inch square sleeve face at 300 dpi is 3,600 pixels square, but gpt-image-2.5's largest square is 2880, or 240 dpi. Your options for the last 60 dpi.
- AI voice disclosure: OpenAI rule, cloning consent, Voxtral license
What the OpenAI, Microsoft and Mistral pages say about disclosing AI speech, cloning a voice and non-commercial weights, and a publish-time checklist.
Written by Sume