Measured 17 September 2026

What your photos reveal, and what removing it actually costs

A phone photograph carries a block of hidden data: where it was taken, to about a tenth of a metre, when, on which device, and often the serial number of that exact camera body. I built test photographs carrying known metadata, read them with this site’s own parser, and measured what each way of removing it does to the picture. The short version: stripping the metadata left a file byte-for-byte identical to one that never had any, and converting the photo instead is the expensive way round.

What was actually in the file

The test photograph carries 346 bytes of EXIF — about half a percent of a 68 KB file, and invisible unless you go looking. Here is what the metadata reader on this sitepulled out of it, verbatim:

Read from the test photograph by src/lib/images/metadata.ts
FieldValueWhy it matters
GPS position27.703428, 85.328669Six decimal places is roughly a tenth of a metre. This is not "the city you were in" — it is the doorway.
Date and time taken2026:06:14 09:31:07To the second, in the camera’s local time. Combined with the position it places you somewhere at a moment.
Camera makeAcmeIdentifies the manufacturer of the device that took the photo.
Camera modelAcme Phone 14 ProNarrows the device to a specific model, and so a price bracket.
LensAcme 26mm f/1.8Which camera on a multi-camera phone, which is a detail about the device.
Body serial numberSN-TEST-0001The strongest field here: it links every photo from one physical device to every other.
SoftwareAcmeOS 19.2The operating system version, which is a fingerprinting detail.

The coordinate is the one worth sitting with. Six decimal places of latitude and longitude is a precision of roughly ten centimetres. A photo of a cat on a sofa, posted publicly, can carry the position of the sofa. And because the body serial number travels with every photo from the same device, a set of images from different accounts can be tied to one physical camera without any other evidence.

Not every photo carries all of it. The second test file had the camera fields and the timestamp but no GPS — 154 bytes instead of 346 — which is what you get when location services were off for the camera. The only way to know which case you are in is to look.

Three ways to get rid of it, measured

All three work. They cost very different things, and the difference is not obvious from the outside.

Starting from the 68 KB test photograph. The control is the same picture saved with no EXIF at all: 68 KB.
MethodResultPixels unchangedImage data unchanged
Strip the metadata68 KBYesYes
Re-save as JPEG (quality 88)62 KBNoNo
Convert to PNG674 KBYesNo

Stripping is not "nearly" lossless

This is the result I most wanted to check, because it is the claim the tool makes. Removing the EXIF segment and leaving the compressed scan data alone produced a file whose SHA-256 matched the control photograph exactly — the same picture saved without metadata in the first place. Not close to it. The same 68 KB, the same hash.

That is worth stating precisely because “lossless” gets used loosely. A JPEG’s image data lives in segments that have nothing to do with the EXIF segment, so removing one does not require touching the other. No decoding happens, no re-encoding happens, and there is no quality setting to get wrong.

The re-encode folklore is half right

The common advice for removing metadata is to convert the photo, or screenshot it, or re-save it. That does work — every re-encode in this test came out with no metadata at all. But it is worth knowing what you are paying, and the answer is less alarming than the usual warnings suggest, in one direction and worse in another.

The same photograph re-encoded at each quality. Drift is the mean absolute difference per colour channel, 0–255, against the decoded original.
Re-encode qualitySizeMean driftWorstChannels changed
0.9581 KB0.08137.4%
0.88 (matches source)62 KB010%
0.7534 KB0.992967.9%
0.621 KB1.229974.4%
0.413 KB1.5211179.4%

Re-encoding at the quality the file already had moved the pixels by nothing measurable — mean drift 0, with 0% of colour channels changed at all. A single re-save at a matching quality is very nearly a no-op, because the coefficients are already quantised to that grid. The widely repeated idea that any re-save visibly wrecks a JPEG is overstated for one pass.

Two things do cost you. Asking for more quality than the file contains is pure waste: at 0.95 the file grew to 81 KB — about 20% larger than the original — while moving 7.4% of channels and recovering nothing, because the detail was already gone. And dropping below the source quality is a real loss: at 0.6, 74.4% of channels changed. None of it is reversible, and it compounds every time the picture is saved again.

Converting to PNG is the other end of the trade. It kept the decoded pixels exactly, removed the metadata, and produced 674 KB — almost ten times the original. It works, and it is the most expensive way to do it.

What I would actually do

If the goal is to remove the metadata and nothing else, strip it. It is the only one of these that leaves the photograph untouched, and you can confirm that yourself by comparing checksums rather than taking my word for it.

Re-encoding is a reasonable choice when you were going to re-encode anyway — you are already resizing or compressing the picture for somewhere, and the metadata going with it is a free side effect. Doing it only to remove metadata means paying for a decode and encode you did not need.

And it is worth checking before you assume. Most social platforms already strip EXIF on upload; plenty of messaging apps, cloud drives, and direct file transfers do not. The metadata tool here shows you what is in a file before it removes anything, which is the part that matters — a tool that silently removes something you never saw cannot tell you whether you needed to worry.

Limits of this test

Repeat it yourself

Both scripts are in this site’s repository. The first builds the test photographs with Pillow, the second reads and strips them with the site’s own code and runs the re-encodes in Chromium — two independent implementations on either side of the file, which is the only reason the read-back means anything.

python3 scripts/make-metadata-test-photos.py tmp/photos
npx tsx scripts/measure-metadata-survival.mjs tmp/photos

To check your own photo rather than mine, open Remove EXIF Data and drop it in. It lists what it found before it changes anything, and like everything here it runs in your browser — the photo you are checking for hidden location data is not uploaded to check it, which would rather defeat the point. The PDF tool study in this section covers how to verify that claim for yourself.