Free & Private Online Browser Utility
Passport Photo Checker Free
Check a passport or ID photo in your browser against the printed size a form asks for and against the backdrop it usually gets rejected for. The page runs eight reads on the file in front of it. Four come from its dimensions: the pixel canvas, the millimetres of paper that canvas makes at 300 DPI, how far its aspect ratio drifts from the target shape, and the centre crop it would need to become that shape. Four come from its pixels: whether the four corners of the backdrop agree with each other, whether the top of the frame is lit like the bottom, what share of the edge ring sits inside your colour tolerance, and how far the average backdrop sits from pure white. Nothing here is a face detector. Head height, eye line and chin-to-crown are not measured by this page, and a checker that printed a head-size row would be printing a number from a model it does not have. What it does give you is the two failure classes that pixel arithmetic can actually see — a photograph too small for the print size it claims, and a wall that is not the plain even backdrop a form expects — as figures with their sample counts attached, so you can check them by hand instead of taking them on trust.
How to use
-
Step 1: Choose a Photo
Drop a JPG, PNG or WebP portrait onto the panel, or click it and pick one from your device. The browser decodes it into a canvas in the same tab: the size reads come off the file's own dimensions and the colour reads off a copy whose long edge is at most 800 px. There is no upload, no worker and no analytics call carrying pixels.
-
Step 2: Or Measure a Synthetic Sheet First
Four built-in sheets stand in for a photograph when you would rather see how the reads behave before judging your own file: an even grey wall, a wall lit from one side, a patterned curtain, and a portrait whose shoulders cross the bottom edge. They are generated from pixel arithmetic rather than photographed, so every figure they produce is reproducible on your machine.
-
Step 3: Pick the Target Size and Tolerance
Press one of the 8 presets — 413x531 px (35x45 mm) is the default, because it is the shape most often asked for and least often met — then set the colour tolerance anywhere between 5% and 60%. It starts at 24% because that is the value the background changer ships with, so the two pages judge the same wall by the same ruler.
-
Step 4: Read the Table, Then Copy It
Every row prints what was measured, what the preset or threshold asks for, and the arithmetic between them, including the raw counts: the coverage row says 4056 of 4056 rather than only 100.0%. Copy the whole report as plain text when you need to show someone which pixel bounced a submission.
Worked example
Input: Even grey wall — the 300 × 400 px synthetic sheet measured against 413x531 px (35x45 mm) at the default 24% tolerance
Output: Pixel canvas reads 300 × 400 px against the 413 × 531 px the preset computes: short by 113 × 131 px, which is 9.6 × 11.1 mm of paper at 300 DPI the file does not have. Printed size 25.4 × 33.9 mm against 35.0 × 45.0 mm. Aspect ratio 0.7500 against 0.7778, called a match. Centre crop 300 × 386 px at scale 1.377×, which needs about 89.5% more pixels than that crop holds. Backdrop evenness 0.0% and top-to-bottom lighting 0.0%, both even, off a corner average of rgb(220, 220, 220). Pixels within tolerance 100.0% — 4056 of 4056 sampled edge pixels inside 24% of that average, counted in a 12 px band round the frame, one pixel in every 2, from corner patches 15 px square. How far the backdrop is from white: 13.7%.
The other three sheets are why the colour reads are four rows rather than one. The patterned curtain spreads only 2.7% corner to corner and its wall averages to a plausible grey, yet 2754 of 4056 edge pixels match, so coverage reads 67.9% and calls it busy. The side-lit wall is the mirror image: 48.6% corner spread, 48.6% from the top band to the bottom one, coverage down to 51.8% (2100 of 4056). The sheet with shoulders in frame defeats the corner test entirely — 0.0% spread, backdrop row even — and coverage still falls to 87.7% (3558 of 4056), because a jacket is standing where the ring expects a wall. 90% is the share this page calls clean. None of these figures is an official requirement, and no form in the world asks for any of them by number.
Tips & limits
- Run the check before you crop. A photo that is 113 × 131 px short of its preset cannot be repaired by trimming; it needs a larger source file or a coarser print density, and the printed-size row is the one that tells you which.
- If coverage is the only failing row while the corner row agrees, the problem is texture or a shoulder rather than a colour cast. Chasing it by changing the wall colour will not move it — cropping tighter, or stepping further from the wall, will.
- Fix lighting with the lamp and not the slider. When the top-to-bottom row disagrees with the corner row you are looking at a gradient, and raising the tolerance to 60% only hides it from this page; the encoder and the reviewer both still see it.
- Re-measure after any editor touch. A crop changes the canvas, the print size and the aspect row at once, while re-encoding changes nothing here because no read touches a header field — a dpi tag inside a JPEG is a claim about intent, not a measurement of detail.
Common problems
- The report calls my backdrop busy when the wall looks plain to me
Compare the two rows before trusting either. Identical corners with coverage under 90% means something crosses the edge ring — a shoulder, a door frame, a chair back — and the fix is to recompose or move away from the wall, not to pick a different colour.
- Every size row reads under and the crop row asks for an enlargement
The file is smaller than the print size at 300 DPI, usually because a chat app resized it on the way to you. Supply the camera original; resampling cannot invent detail, so the printed-size row is the honest figure to quote to whoever asked for the photo.
- The file-weight limit field will not accept typing
It stays disabled while a synthetic sheet is loaded, because generated pixels have no encoded byte size to compare against a ceiling. Choose a real JPG, PNG or WebP file and the field becomes editable.
- The verdicts changed when I moved the tolerance slider
That is the method working, not a bug: tolerance is a share of the black-to-white colour distance, so a lower number counts more pixels as mismatched and a higher one forgives a gradient. Judge your own file at the 24% default first, then explore.
Frequently Asked Questions (FAQ)
What does a passport photo checker actually measure?
Eight things, split by source. From the dimensions: pixel canvas, the millimetre print size those pixels make at 300 DPI, aspect-ratio drift against the chosen preset, and the centre crop and scale needed to reach that shape. From the pixels: the widest disagreement between the four corner patches, the difference between a top band and a bottom band, the share of edge-ring samples within your colour tolerance, and the distance from the backdrop average to pure white. Each row prints its own target and its arithmetic.
Why does my backdrop look even but still fail the coverage row?
Because the two rows sample differently. Backdrop evenness compares four small corner patches, so a wall that averages the same grey in each corner passes it. Coverage walks a band all the way round the frame and counts pixels individually, so a woven curtain, a skirting board or your own shoulder crossing the bottom edge is reported even when every corner agrees. The synthetic curtain and the synthetic portrait each demonstrate one half of that.
What does the colour tolerance slider change?
The threshold a pixel has to fall inside to count as matching the corner average, expressed as a share of the distance between pure black and pure white. At 24% a pixel within 0.24 of that distance matches. It changes the coverage verdict and nothing else — the size rows, the corner spread and the distance from white are all independent of it.
Can this page tell me my head height in the photo?
No, and no page should trust itself to. Head height, eye-line position and chin-to-crown measurements need a face detector, which is not what this file contains. The honest substitutes are a ruler against your screen at a known print size, or a studio that measures on the spot. This page reports the backdrop and geometry it can compute from pixels.
Is 300 DPI a requirement for passport photos?
It is the density this page prints its millimetre figures at, because it is the density the background converter exports at and the one most photo labs work to. It is not a rule that applies to your form. Some authorities specify pixels, some specify millimetres of print, and a dpi field inside a file header changes neither — which is why the printed-size row measures the pixels and states the assumption out loud.
Why do you offer synthetic sheets instead of a sample passport photo?
A real portrait would let this page look authoritative while hiding which row was doing the work. Four generated frames let you watch each read fail on its own: one passes everything, one fails lighting only, one fails coverage while its corners agree, and one shows the blind spot where a person is mistaken for a wall. Every figure they produce can be regenerated from the same arithmetic, which is the property a photograph cannot offer.
What is the difference between this checker and a passport photo editor?
A checker measures and refuses to change anything; the editor changes pixels and cannot tell you whether the result is acceptable. They share one size module and one distance formula, so a wall this page calls busy at 24% is the same wall the background changer will recolour partially and leave textured. Measure first, fix second, then measure again.
What a Passport Photo Checker Actually Measures
A rejection notice rarely says which pixel failed, so people guess. This page does not guess. It reports 8 reads off the file in front of it — 8 size presets, one of them chosen — and four of those reads come from the file's own dimensions while the other four come from its pixels.
The size reads are arithmetic. At 300 dots per inch a pixel is one 300th of an inch of paper, so the 413 px canvas this page measures against is 34.97 mm of print and 591 px is 50.04 mm — which is why the presets on the buttons are authored as millimetres and their pixels are computed from them. That same 300 DPI is the density the background changer exports at, and the two pages share one size module, so a number on this page cannot drift away from a number on that one.
The colour reads are measurements, and they use the same ruler the changer uses. A tolerance of 24% means 0.24 of the distance between pure black and pure white — the straight-line distance through red, green and blue, the same quantity the changer multiplies by its own tolerance slider. Nothing here is a model: the whole method is averaging and subtraction, which is precisely why every row can be reproduced by hand from a screenshot of the pixels.
The Four Colour Reads, and What Each One Can Tell You
Backdrop evenness compares the four corner patches against each other and reports the widest pair. Each patch is a square 5% of the frame's short edge, sitting one patch-width in from the corner — the very corner is where a scanner's black border and a lens vignette live, so sampling it would report a defect that is not in the wall.
Top-to-bottom lighting averages a band across the middle half of the frame near the top and another near the bottom. A window to one side of the subject shows up here first: a wall can match itself corner to corner and still fall a long way between the hairline and the chin, and that is the shape of most "the background is uneven" rejections.
Pixels within tolerance counts every 2th pixel in a band 4% of the short edge deep, all the way round the frame, and reports how many sit inside your tolerance of the corner average — printing the counts themselves, not just the percentage. This is the row that catches texture: a curtain can average to a plausible grey in every corner while a third of its individual pixels are nowhere near it, and a corner-sampling tool will happily recolour the flat parts and leave the weave behind.
Distance from white is exactly what it says — how far the average backdrop colour sits from pure white, as a percentage of the black-to-white distance. It is a measurement, not a requirement: some forms want white, some want a specific light blue, and this page has no opinion about which one your government asked for.
What This Page Will Never Tell You
Head height, eye line, chin-to-crown, whether your eyes are open, whether the shadow behind your ears is acceptable, and whether an officer will accept the result. None of it is measured here, and a page that printed a head-size row would be printing a number from a face detector that does not exist in most browsers. The honest answer to "what is my head height in this JPEG" is that no pixel arithmetic in this file knows where a face is.
The same limitation runs the other way, and it is worth seeing rather than being told. The edge ring counts pixels, and a shoulder crossing the bottom of the frame is counted as a mismatched pixel exactly like a patterned wall is. Load the fourth synthetic sheet: its four corners come back identical, its backdrop row calls the wall perfect, and its coverage still drops, because the jacket is standing where the sample expects a wall.
Aspect-ratio drift is called a match within 5% because at that drift the largest centre crop keeps 95.2% of one edge — the band is a statement about how much of your photograph the crop has to give up, not about how close official sizes are to each other. Two of the presets on this page differ in shape by far more than that band, which is why they are separate buttons.
Why the Colour Reads Use a 800 px Proxy
Size rows are computed from the file's own dimensions. Colour rows are computed from a copy scaled so that its long edge is at most 800 px, because the alternative is decoding a whole phone panorama into a raw pixel buffer on a mid-range laptop for the sake of four averages. Every colour read is a fraction-based region — corners, bands, an edge ring — so scaling first changes how many pixels are counted rather than what they say, and the coverage row prints its own sample size so you can see the difference instead of trusting it. A synthetic sheet is measured at full size, because it is already smaller than the proxy.
Nothing leaves the tab. The file is decoded by your browser into a canvas, the canvas is read by arithmetic in src/utils/idPhotoCheck.js, and no upload, worker or analytics call is involved — which is also why the figures on this page are reproducible rather than server-side promises.