Vintage Film Photo Generator: develop one photo on 18 film looks and save a full-size JPG
The Vintage Film Photo Generator gives a photo from your phone or digital camera the color and grain of a film camera. Choose a photo and the 18 frames of the film strip below are developed from it right away. Tap a frame to develop it large on the stage above. You can then set film strength, grain, vignette, light leak, brightness and saturation, add a capture-date stamp and an instant or film border, and drag across the stage to compare with the original.
Everything runs on a canvas inside your browser, and the photo is never uploaded to a server. The saved JPG keeps the original size and is scaled down only when the long side, border included, would pass 4,096 px. The original's photo data (camera, location) is not copied into the saved file.
When it helps
- Matching the color of many photos: develop a trip or an event on the same film at the same strength, and an album or feed settles into one tone.
- Keeping the mood of the day: the capture date stored in the photo data is stamped in orange digits at the lower right, and the instant border gives the wide bottom margin of an instant print. No need to type a date by hand.
- Choosing a direction before you buy film: with film you see nothing until it is shot, developed and scanned. Putting the same scene side by side as Portra 400, Gold 200 and Fujifilm 400 looks helps you decide between a warmer and a cooler palette. They are not the same colors as the real films, as the limits section below explains.
- Giving an invitation, poster or blog header an old-photo feel: black-and-white or sepia inside a 35 mm film border looks like a frame cut from an old contact sheet.
How to use it
- Choose a photo: press Choose photo, drop a photo onto the workspace, or paste a copied image. A sample photo is open at first.
- Choose a film: tap one of the 18 frames, laid out like a contact sheet in three rows of six (three per row on narrow screens).
- Adjust: film strength sets how much of the film color is mixed in. Then set grain, vignette, light leak, brightness and saturation. Grain and vignette start at a different default for each film, and once you move a slider, that value stays when you switch films.
- Finish: turn the date stamp on or off or change the date, and pick a border: none, instant or film.
- Compare and save: drag across the stage (or use ← and → on the keyboard) to compare with the original, then press Save JPG. Copy puts the same picture on the clipboard as a PNG.
18 film looks and their color curves
For each film, the tool fixes five points: how much red, green and blue come out for input brightness 0, 64, 128, 192 and 255. It joins them with the monotone cubic interpolation of Fritsch and Carlson (1980). That method never wobbles between points and only ever rises, so a bright tone cannot end up darker than a dark one. The color curve graph on the workspace draws the curve of the film you have selected, and the table below lists the values the tool actually uses.
| Film | Type | Black 0 → | Gray 128 → | White 255 → | Saturation | Default grain |
|---|---|---|---|---|---|---|
| Original color | No color correction | 0·0·0 | 128·128·128 | 255·255·255 | ×1 | 0 |
| Gold 200 look | Kodak color negative · ISO 200 | 8·4·0 | 140·132·116 | 252·248·232 | ×1.08 | 22 |
| UltraMax 400 look | Kodak color negative · ISO 400 | 6·2·4 | 140·128·118 | 254·250·238 | ×1.15 | 24 |
| Portra 400 look | Kodak color negative · ISO 400 | 14·12·14 | 136·132·128 | 248·246·242 | ×0.95 | 18 |
| Ektar 100 look | Kodak color negative · ISO 100 | 0·0·0 | 132·128·126 | 255·253·250 | ×1.3 | 8 |
| Fujifilm 400 look | Fujifilm color negative · ISO 400 | 6·8·12 | 124·136·134 | 248·251·248 | ×1.06 | 20 |
| Velvia 50 look | Fujifilm slide film · ISO 50 | 0·0·6 | 126·126·132 | 255·255·255 | ×1.45 | 6 |
| Provia 100F look | Fujifilm slide film · ISO 100 | 0·0·2 | 128·128·130 | 254·254·254 | ×1.12 | 7 |
| Tri-X 400 look | Kodak black-and-white negative · ISO 400 | 4·4·4 | 128·128·128 | 252·252·252 | B/W | 32 |
| Sepia | Black-and-white toning | 26·16·8 | 164·134·100 | 250·232·198 | B/W | 20 |
| Instant | Instant film feel | 30·34·46 | 140·142·138 | 240·238·226 | ×0.85 | 6 |
| Cross process | Processing effect | 0·10·52 | 122·146·120 | 255·250·182 | ×1.2 | 18 |
| 1970s | Era and mood effect | 42·28·12 | 162·138·102 | 246·226·192 | ×0.9 | 22 |
| 1980s | Era and mood effect | 14·4·26 | 140·122·144 | 252·242·250 | ×1.15 | 18 |
| 1990s | Era and mood effect | 8·16·22 | 134·138·128 | 252·248·232 | ×1.05 | 20 |
| Cinema | Era and mood effect | 0·8·26 | 128·128·134 | 255·246·222 | ×1.05 | 14 |
| Faded | Era and mood effect | 46·46·54 | 142·142·144 | 236·236·232 | ×0.8 | 16 |
| Sun-bleached | Era and mood effect | 72·62·48 | 170·158·136 | 246·236·214 | ×0.6 | 12 |
Reading the table is simple. If black 0 maps to a number above 0, blacks lift to gray and the picture looks faded. If red is higher than blue at gray 128, the color is warm, and if it is lower, the color is cool. If white 255 maps below 255, the brightest tones are pressed down and look softer. The saturation factor sets how strong the color becomes after the curve, and black-and-white films are turned to gray first and then run through the curve.
For the films that carry a real film name, the direction of the curve follows what the maker says about the film in its own material.
| Film | Maker's description (gist of the original) | What the curve does |
|---|---|---|
| Portra 400 | Kodak: spectacular skin tones and exceptional color saturation | Lifts blacks a little and lowers contrast to soften skin, with saturation almost unchanged |
| Ektar 100 | Kodak: the finest-grain color negative film available today, ultra vivid color | Saturation ×1.3, with the smallest default grain |
| Gold 200 | Kodak: versatile medium-speed daylight film for everyday photography, fine grain and vibrant saturation | Raises red and lowers blue for a warm, slightly yellow color |
| UltraMax 400 | Kodak: high-speed daylight film, fine grain and vivid saturation | A little more contrast and saturation than Gold 200 |
| Tri-X 400 | Kodak: high-speed panchromatic black-and-white negative, classic grain structure | Converts to black and white, raises contrast and makes the grain coarser |
| Velvia 50 | Fujifilm: world-class levels of image color saturation and vibrancy | Saturation ×1.45, with high contrast |
| Provia 100F | Fujifilm: ultrafine grain (RMS 8), medium color saturation and contrast | Saturation ×1.12, with only a little contrast |
| Fujifilm 400 | Fujifilm: fine grain for a high-speed film, excellent skin-tone reproduction | Slightly raised greens and blues for a fresher palette |
How one picture is built
- Brightness: a gamma of 2−brightness/100 is applied. Black 0 and white 255 stay put and only the midtones move, so highlights don't blow out to white.
- Film curve: a black-and-white film first turns the picture gray (0.299 red + 0.587 green + 0.114 blue). Red, green and blue then each go through their own curve.
- Film saturation: brightness stays the same while the intensity of the color is changed by the film's saturation factor.
- Strength: the color after the film and the color before it are mixed by the strength setting.
- Saturation adjustment: color is pushed further or pulled back by the saturation slider. At −100 the picture is black and white.
- Light leak, grain, vignette: an orange glow is laid in from the upper right and lower left, a noise pattern that is always the same is laid over the picture as grain, and the edges are darkened.
- Date stamp and border: the date is stamped at the lower right in seven-segment digits, and the chosen border is added.
result = brightness-adjusted original + (film color − brightness-adjusted original) × strength
Example: a gray (128, 128, 128) developed as Gold 200 style comes out of the curve as (140, 132, 116), and after saturation ×1.08 as (140.6, 132.0, 114.7). At 100% strength that is (141, 132, 115). At 60% strength red becomes 128 + (140.6 − 128) × 0.6 = 135.6, giving (136, 130, 120).
The sizes of grain, vignette, light leak, date and border are all set in proportion to the photo size. That is why the grain and the date look the same relative size in the small on-screen preview and in the file saved at full size. The grain pattern is also generated from a fixed seed, so it does not flicker and change as you move a slider.
Grain and the Print Grain Index (PGI)
In its film data sheets Kodak gives the Print Grain Index (PGI) to describe how coarse grain looks in a print. According to the data sheet, PGI is a scale matched to what the eye perceives: 4 units is a difference that 90% of observers notice, and 25 is roughly where grain starts to be visible. The values are for a print viewed at 14 inches (about 36 cm), and the same film gets higher numbers the larger the print.
| Film | 4 × 6 in | 8 × 10 in | 16 × 20 in | This tool's default grain |
|---|---|---|---|---|
| Ektar 100 | less than 25 | 38 | 66 | 8 |
| Portra 400 | 37 | 59 | 89 | 18 |
For films with a published PGI, the default grain is (PGI − 15) × 0.8, with anything under 25 counted as 25. That gives 8 for the Ektar 100 look and (37 − 15) × 0.8 = 17.6, rounded to 18, for the Portra 400 look. No current official PGI figure could be confirmed for Gold 200 and UltraMax 400, and the Fujifilm films quote RMS granularity instead, so their defaults are set from film speed together with the maker's own grain description. Fujifilm calls FUJIFILM 400 fine-grained for a high-speed film, for example, so it sits below the Gold 200 look. Kodak states that PGI is a different scale from RMS granularity, so the two cannot be compared.
As the PGI table shows, grain becomes easier to see the larger the print. If you push grain up because it looks weak on a phone screen, it may look coarse on a large screen or a big print, so it is worth opening the saved file at full size once.
Date stamp and borders
The date stamp copies the way a film camera's back printed the date onto the film with light: orange seven-segment digits, slightly slanted, at the lower right. The digit height is 4.2% of the photo's short side. In English the order is month, day, year, as in 10 20 '26, and a single-digit month or day leaves its first cell blank. The date is looked up in the JPEG photo data (Exif) as the capture time, then the digitized time, then the file time. If none of the three is there, today's date is used.
The instant border takes its proportions from Polaroid Color SX-70 film (overall 107 × 88 mm, image 79 × 77 mm). The side margin (88 − 79) ÷ 2 = 4.5 mm is 5.8% of the short side. With the same margin on top, the remaining 25.5 mm (33%) goes to the bottom. Polaroid says this film takes 10 to 15 minutes to develop fully. The developing effect this tool shows when you switch films is an on-screen effect that finishes in under a second, and it does not appear if reduced motion is turned on in your device.
The film border imitates a scanned strip of 135 film (35 mm wide, with each frame 24 × 36 mm). The top and bottom bands are (35 − 24) ÷ 2 = 5.5 mm, which is 23% of the short side, and sprocket holes and frame numbers are drawn inside them. For a portrait photo the film is turned upright, so the holes run down the left and right.
Common mistakes
- Full strength plus extra saturation: the Velvia 50 and Ektar 100 looks are already highly saturated, and raising the saturation slider on top makes skies and skin look unreal. For a saturated film, start from 60 to 80% strength.
- A photo from a messaging app shows today's date: photo data can be removed when a picture passes through a messaging app or social network. Change the date in the date field to the real one, or open the original file.
- Setting grain on a small screen only: as the PGI table above shows, grain is easier to see the larger you view it. Open the saved file at its real size and check.
- Posting a bordered photo to a square slot: where photos are cropped to a square, the wide bottom margin of the instant border or the film holes may be cut off.
- An HEIC photo won't open: this tool works only with images the browser itself can decode, and HEIC support differs from browser to browser. If it doesn't open, convert it to JPG first.
Limits and cautions
- The 18 films are approximate curves set from what the makers say about each film. They are not a simulation computed from a film's spectral sensitivity or characteristic curve data, and real film color varies with exposure, development, scanning and printing.
- Kodak, Portra, Ektar, Gold, UltraMax, Tri-X, Fujifilm, Velvia, Provia and Polaroid are trademarks of their respective companies. This tool has no affiliation with those companies, and the names are used only to say which film's feel is being imitated.
- Calculation uses the browser canvas defaults (sRGB color space, 8 bits per channel). A wide-gamut photo (Display P3, for example) is converted to sRGB, and very saturated colors can come out a little weaker.
- The saved size is capped at 4,096 px on the long side, border included, and the original's photo data (camera, location, capture date) is not kept in the saved file.
- Red bleed around bright lights (halation), lens distortion, soft focus, dust and scratches are not drawn.
Basis: the relevant sentences in the data sheets, product pages and standards below were checked on 2026-10-20. The numbers in the film table and in the example are the same as the tool's calculation.
Sources
- 01Kodak Alaris — KODAK PROFESSIONAL PORTRA 400 Film, Technical Data E-4050January 2025 edition: PGI definition (4 units = a difference 90% of observers notice, 25 = threshold, 14-inch viewing distance), 135-format PGI 37 · 59 · 89, 24 × 36 mm, feature wording
- 02Kodak Alaris — KODAK PROFESSIONAL EKTAR 100 Film, Technical Data E-4046January 2025 revision, 135-format PGI under 25 · 38 · 66
- 03Kodak — EKTAR 100 Color Negative FilmISO 100, the finest-grain color negative film available, ultra vivid color
- 04Kodak — GOLD 200 FilmMedium-speed daylight color negative for everyday photography, fine grain and vibrant saturation
- 05Kodak — ULTRAMAX 400 FilmHigh-speed daylight color negative, fine grain and vivid saturation
- 06Kodak — TRI-X 400 Black & White Negative FilmHigh-speed panchromatic black-and-white negative, classic grain structure
- 07Fujifilm — FUJICHROME Velvia 50Daylight color reversal film, world-class color saturation and vibrancy
- 08Fujifilm — FUJICHROME Provia 100FUltrafine grain (RMS 8), medium color saturation and contrast
- 09Fujifilm — FUJIFILM 400Fine grain for a high-speed film, excellent skin-tone reproduction
- 10Polaroid — Color SX-70 FilmOverall 107 × 88 mm, image 79 × 77 mm, 10 to 15 minutes to develop
- 11Fritsch, F. N.; Carlson, R. E. (1980). Monotone Piecewise Cubic InterpolationSIAM Journal on Numerical Analysis 17(2), 238–246, monotone cubic interpolation
- 12CIPA — DC-008 Exif 3.1 (2026)Exif standard for digital still cameras, date and time of capture tags
- 13WHATWG — HTML Living Standard, Canvas 2DDefault 2D canvas settings: colorSpace "srgb", colorType "unorm8"
Frequently asked questions
Is my photo uploaded to a server?
No. The photo is processed on a canvas inside your browser, and the JPG you save is made on the device you are using. This tool does not send photos to a server, and the photo you opened disappears when you close the page.
Are the colors the same as shooting on real Portra 400 or Velvia 50?
No. They are approximate color curves made from what the makers say (Kodak stresses the skin tones of Portra 400, and Fujifilm the very high color saturation of Velvia 50). Real film color varies with exposure, development, scanning and printing, and this tool does not compute from a film's spectral sensitivity or characteristic curve data.
Does saving make the photo smaller?
It saves at the original size. If the long side, border included, would pass 4,096 px, it is scaled down to fit. That cap avoids cases where a phone browser cannot create a very large canvas. JPG quality is 0.92.
Where does the date stamp get its date?
It reads the capture date (DateTimeOriginal) from the JPEG photo data (Exif), and uses today's date if that data is missing. Photos that passed through a messaging app or social network may have had their photo data removed. You can change the date in the date field, and the English version stamps it in month, day, year order.
Why does each film have a different default grain?
Kodak's data sheets give the Print Grain Index (PGI) to show how visible grain is in a print. For 135 film printed at 4 × 6 inches, Ektar 100 is under 25 and Portra 400 is 37. For films with a published PGI this tool sets the default to (PGI − 15) × 0.8, and for the rest it uses film speed together with the maker's grain description. Once you move the grain slider, that value stays when you switch films.
My iPhone HEIC photo won't open.
Whether HEIC opens depends on the browser. This tool only works with photos the browser itself can open, so if it doesn't open, convert the HEIC to JPG first and then open it.
Does the saved photo keep my location?
No. The JPG is redrawn on a canvas, and the original's photo data (camera, location, capture date) is not copied into it. If you want the capture date to stay on the picture, turn on the date stamp.
The small frames on the film strip look slightly different from the stage.
The strip frames are samples developed with the film's defaults (100% strength, brightness and saturation unchanged), and they have no grain drawn. The stage includes your current strength, grain, vignette, light leak, brightness and saturation, plus the date stamp and border.