Proofs of address arrive as phone photos. Payslips arrive as screenshots. An image file is not just pixels — it is a container that records what captured it, what encoded it, when, and often what touched it afterwards. Most of that survives editing, because most tools do not bother to clean it up — and some generators and editors write their names into the file on purpose. This page walks the checks by hand, then shows the automated version.
One caveat governs everything below: a match is strong, an
absence is nothing. Image metadata is trivially removable, and
the most common remover is not a forger — it is WhatsApp. A file that
says Adobe Photoshop was in Photoshop; a file that says
nothing has merely said nothing. Tamperlens reports
risk signals, not verdicts, and so should you.
1. Read the EXIF block
The cheapest check. A direct capture from a phone or camera carries an
EXIF block naming the device (Make, Model),
the exposure (shutter, aperture, ISO), the capture time, and often the
lens and GPS position. On a Mac, Preview → Tools → Show
Inspector; anywhere else,
ExifTool reads every field:
Dump everything the file says about itself
exiftool -a -G photo.jpg
For a document photograph — a utility bill on a kitchen table — a coherent capture block is what the file's own story predicts. The checks below are all comparisons against that story: a file claiming to be a phone photo should be encoded like one, timed like one, and shaped like one.
2. Look for editor fingerprints
Editors announce themselves in the Software tag, in the
XMP CreatorTool, or — for Photoshop specifically — in a
dedicated APP13/Photoshop IRB segment that survives even some metadata
strippers. Strings like Adobe Photoshop 26.0,
GIMP, Pixelmator, Canva or
Snapseed mean the file passed through that tool.
"Passed through" is the honest claim, and the strongest claim available. A crop for size, a rotation for orientation and a forged salary figure all leave this same trace. The editor fingerprint tells you the file's rendered content is not necessarily what left the camera; it cannot tell you which pixels changed or why. Treat it as a fact worth explaining, exactly like a consumer editor in a PDF's Producer field.
3. Look for AI-generator traces
Generated images frequently say so, in three places worth checking by hand:
-
PNG text chunks. Stable Diffusion front-ends write
their entire prompt and sampler settings into the file —
Automatic1111 under a
parameterskey, ComfyUI as a workflow JSON.exiftoolshows these as ordinary tags. -
Software and XMP fields.
Midjourney,DALL·E,Adobe Fireflyand others name themselves the way an editor would. - C2PA / Content Credentials. A cryptographically signed provenance manifest, increasingly attached by both generators and cameras. Verify one at contentcredentials.org. A valid C2PA manifest is the closest an image gets to a PDF's digital signature: a checkable statement of where the file came from.
The asymmetry from the callout applies with full force. These traces find files that announced their generation; a screenshot of a generated image, or a re-save through any stripping tool, removes all three. No metadata check can certify that an image is not AI-generated — anyone claiming otherwise is selling something.
4. Compare the four timestamps
An image can record time in four independent places: when the shutter
fired (DateTimeOriginal), when the frame was digitised
(DateTimeDigitized — equal to the first on any direct
capture), when the file was last written (ModifyDate), and
the GPS receiver's UTC timestamp — which comes from satellites, not
from the device clock, and cannot be set in a settings menu.
- ModifyDate later than DateTimeOriginal means the file was written again after capture — an edit or a re-encode, of unknown content.
- DateTimeOriginal disagreeing with the GPS timestamp by more than clock drift is the strong version: the satellite time is the one a device owner cannot quietly adjust before "capturing" a backdated document.
- Capture time after file time, or dates in the future — impossible orderings mean at least one timestamp was set by something other than the camera pipeline.
5. Check the encoding against the claimed origin
The pixels' wrapper betrays re-encoding even when every metadata field has been cleaned. Three checks need no decoder:
- Progressive JPEG claiming to be a camera capture. Cameras emit baseline JPEG; progressive encoding comes from software — web export pipelines, editors, optimisers.
-
Quantisation tables that don't match the claimed maker.
A JPEG's quality tables identify the encoder family. A file whose
EXIF says
Canonbut whose tables are textbook libjpeg was re-encoded after it left the camera. - The format itself. No camera or phone hands the user a WebP. A WebP arriving as evidence has been through a conversion step — a website, a CDN, a messaging app — and that conversion is itself the finding: the bytes you hold are not the bytes that were captured.
6. Check the container's structure
Everything above reads metadata — claims the file makes about itself,
which a competent forger simply deletes. The container's shape
is different: a forger has to get it right by accident. A PNG ends at
its IEND chunk; anything after it was appended by
something. Chunk lengths and CRCs must agree; a JPEG must close with
its FFD9 end-of-image marker. On the command line:
Bytes after the declared end of a PNG
$ python3 -c "d=open('doc.png','rb').read(); i=d.rfind(b'IEND')+8; print(len(d)-i, 'trailing bytes')"
2048 trailing bytes
Trailing payloads, broken checksums and truncated containers each mean the file was assembled or damaged by something other than a normal encoder — worth explaining before the document is trusted.
7. What missing metadata means
Less than you want it to. Every major messaging platform strips EXIF on upload as a privacy measure; social networks, CDNs and screenshot tools do the same. A bare file is therefore the normal condition for anything that travelled through WhatsApp — which, for documents submitted by customers in much of the world, is most files. Absence moves the question ("why does a fresh camera capture carry nothing at all?"), it never answers it. The useful posture: metadata present is evidence to read; metadata absent is a reason to rely on the structural and encoding checks above, which survive stripping.
Automating it
Tamperlens runs exactly these checks on every JPEG, PNG and WebP — the same engine, endpoint and report as for PDFs. Ten image signal families cover generator metadata, editor fingerprints, dimension and encoding mismatches, recompression traces, date anomalies, missing metadata, container structure, C2PA provenance and capture context, each with a severity, a plain-English detail and the raw evidence behind it.
The engine reads structures the encoder wrote; it deliberately decodes no pixels, executes nothing, and calls no third-party service. Deterministic: the same bytes produce the same report. Files are parsed in memory and never written to disk.
Check an image now, free
Drop a photo or screenshot into the checker on the home page — no account, nothing stored, full report. When you want it in your pipeline, an API key with 25 documents a month is free: see the API quickstart or create an account.
Tamperlens reports risk signals, not authenticity verdicts. Signals can have benign causes; combine them with your own decision logic.
Related reading
- How to detect if a PDF was edited The PDF counterpart to this page: metadata, revisions, /ID pairs and signatures.
- PDF fraud signals field guide All ten PDF signal families, what each detects, its benign causes and how severity is decided.
- Bank statement fraud signals The lender/BNPL/proptech view: what forged statements look like and how to screen them.
- API quickstart Auth, curl examples, the report JSON annotated, quotas and pricing.