EXIF STUDIO

Photo metadata fidelity: samples, hashes & reproducible tests

Reproduce 36 metadata transformations across nine synthetic JPEG, PNG, WebP and classic TIFF fixtures. Download samples, outputs and payload hashes.

Updated
Metadata changes file bytes without requiring image recompression. This product-authored test publishes nine synthetic fixtures and 36 transformations: preserved image payloads and decoded raw pixels match before and after.

Version v1 · October 30, 2026 · Public evidence downloads are free; no account or download plan required.

Download the complete evidence kit

Download verification kit ZIP · Fixture manifest & source hashes · Full results JSON · Methods & licensing README

The kit includes sources, all four outputs, an originals ZIP, writer snapshots and a verification script. Images are tiny program-generated color grids with invented author, camera and GPS fields; no real people or capture locations are included.

Per-fixture results: payloads and pixels match

Each fixture runs author/camera/GPS edits, GPS-only removal, EXIF-only removal and the all-metadata scope. The two checks compare preserved image block bytes and decoded raw pixels. Expand the final column for output downloads and before/after fields.

Source fixtureImage payloadDecoded pixelsEvidence
jpeg3 × 2 · 8 bit · 1 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-25697fc9edc4263e68aaa095bd52351ef8cdadc701dcd19d35f29c75b249b844d00

Edit author & GPS

File SHA-256 (changes when metadata changes)0320d62f61d9a1e150b2d16710f6caaf08a2b87674dcf57159819a2e726093ac

Preserved image payload SHA-256 (before = after)d91c4de1bc7474611406eb46c4ce5abbd0ee73c226dc73766bf25b55bac54548

Decoded pixel SHA-256 (before = after)7102b42d9c3577e6d98d48bcf1996ac1fe0e47442b57406d855cfe6e1248eddd

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)2e46d1a7c782b7692f64c1bb434344787fbfe30022e297aff77798b6a925d124

Preserved image payload SHA-256 (before = after)d91c4de1bc7474611406eb46c4ce5abbd0ee73c226dc73766bf25b55bac54548

Decoded pixel SHA-256 (before = after)7102b42d9c3577e6d98d48bcf1996ac1fe0e47442b57406d855cfe6e1248eddd

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)2fdeff32dd8ff018facc09a6a367a79ea125019ba684f0270914df42210ec967

Preserved image payload SHA-256 (before = after)d91c4de1bc7474611406eb46c4ce5abbd0ee73c226dc73766bf25b55bac54548

Decoded pixel SHA-256 (before = after)7102b42d9c3577e6d98d48bcf1996ac1fe0e47442b57406d855cfe6e1248eddd

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)2fdeff32dd8ff018facc09a6a367a79ea125019ba684f0270914df42210ec967

Preserved image payload SHA-256 (before = after)d91c4de1bc7474611406eb46c4ce5abbd0ee73c226dc73766bf25b55bac54548

Decoded pixel SHA-256 (before = after)7102b42d9c3577e6d98d48bcf1996ac1fe0e47442b57406d855cfe6e1248eddd

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}
png3 × 2 · 8 bit · 1 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-2564f9fe067303381f4d864bdf7cca0f3156aaec3f4846563b316218db132c2ddc9

Edit author & GPS

File SHA-256 (changes when metadata changes)ff50953bb27b63ff6eb152617253a5dfbd7fbed981ee7d8e03eeb19e370397d8

Preserved image payload SHA-256 (before = after)9a9b7602ccbbf1c53ab63e3a62be7719e8286d82b27c764c713b36c5c657e6bf

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)da82e316bab6503bc5a6adc9620bb4b3080f9b18432192af85d874cec369d304

Preserved image payload SHA-256 (before = after)9a9b7602ccbbf1c53ab63e3a62be7719e8286d82b27c764c713b36c5c657e6bf

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)5622d4a17336a1530918f3a252a619ea81690c999605e27b71fafc7d6f9ef808

Preserved image payload SHA-256 (before = after)9a9b7602ccbbf1c53ab63e3a62be7719e8286d82b27c764c713b36c5c657e6bf

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)5622d4a17336a1530918f3a252a619ea81690c999605e27b71fafc7d6f9ef808

Preserved image payload SHA-256 (before = after)9a9b7602ccbbf1c53ab63e3a62be7719e8286d82b27c764c713b36c5c657e6bf

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}
webp-lossless3 × 2 · 8 bit · 1 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-256fd6030a1765d6bdd52c59c3ed7a91ce2beb59863d2e15d94b5f9a993ca84ef0c

Edit author & GPS

File SHA-256 (changes when metadata changes)0f8c0f01a053d48eaf646c4509c86d3ad1c9d6c6296a8ba789365c7fd0e5d944

Preserved image payload SHA-256 (before = after)e02292fb953efc46d92e74cd60c4e32596cf3c62fb6e6b13a142dee062bc16ec

Decoded pixel SHA-256 (before = after)79edb9bca0862267632dc957812bde6c33267d057f2285708fba9d1a973dd95a

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)aed04a6c36d7fe1ccae37f5da770fb00ffc0f1b658c9115d277f3716f7382a3c

Preserved image payload SHA-256 (before = after)e02292fb953efc46d92e74cd60c4e32596cf3c62fb6e6b13a142dee062bc16ec

Decoded pixel SHA-256 (before = after)79edb9bca0862267632dc957812bde6c33267d057f2285708fba9d1a973dd95a

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)5cef5527a68cea8906de12b6f3526a62a5bf597c5053a825c09498f70ae8faa0

Preserved image payload SHA-256 (before = after)e02292fb953efc46d92e74cd60c4e32596cf3c62fb6e6b13a142dee062bc16ec

Decoded pixel SHA-256 (before = after)79edb9bca0862267632dc957812bde6c33267d057f2285708fba9d1a973dd95a

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)5cef5527a68cea8906de12b6f3526a62a5bf597c5053a825c09498f70ae8faa0

Preserved image payload SHA-256 (before = after)e02292fb953efc46d92e74cd60c4e32596cf3c62fb6e6b13a142dee062bc16ec

Decoded pixel SHA-256 (before = after)79edb9bca0862267632dc957812bde6c33267d057f2285708fba9d1a973dd95a

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}
webp-lossy3 × 2 · 8 bit · 1 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-2562b78bc66168d3ea017356631f304a1d071551b7eeb0c86b0a6afae863df67ac6

Edit author & GPS

File SHA-256 (changes when metadata changes)2e62b776caf7405f736d6b9adbda51a5837a1a065cfb3d8709b5f9c9bb3b6ea6

Preserved image payload SHA-256 (before = after)9b0e333f5cd01d9dee740355a17fe55afdf2d369f500ce62d5ed93ba32190d64

Decoded pixel SHA-256 (before = after)b5651939164fb694fe9c5cbef3c20f38d98cf4f04e4be5c9e9ad9bbce05a9d67

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)01d1343e338ec1674ab9829d12e7062cc8179639fa0ee3375a37363530bfe476

Preserved image payload SHA-256 (before = after)9b0e333f5cd01d9dee740355a17fe55afdf2d369f500ce62d5ed93ba32190d64

Decoded pixel SHA-256 (before = after)b5651939164fb694fe9c5cbef3c20f38d98cf4f04e4be5c9e9ad9bbce05a9d67

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)75c63782d3d0ee6433328b97e315228c93070c5ee2258f4338d44929f9a4f557

Preserved image payload SHA-256 (before = after)9b0e333f5cd01d9dee740355a17fe55afdf2d369f500ce62d5ed93ba32190d64

Decoded pixel SHA-256 (before = after)b5651939164fb694fe9c5cbef3c20f38d98cf4f04e4be5c9e9ad9bbce05a9d67

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)75c63782d3d0ee6433328b97e315228c93070c5ee2258f4338d44929f9a4f557

Preserved image payload SHA-256 (before = after)9b0e333f5cd01d9dee740355a17fe55afdf2d369f500ce62d5ed93ba32190d64

Decoded pixel SHA-256 (before = after)b5651939164fb694fe9c5cbef3c20f38d98cf4f04e4be5c9e9ad9bbce05a9d67

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}
tiff-lzw3 × 2 · 8 bit · 1 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-2566a93074203a54132791cd3c0dd968497852aa90714dab2dc56952a4462dcbaf4

Edit author & GPS

File SHA-256 (changes when metadata changes)44329be5e36c1dd6dc24ba75facc05683d21f36b148f77ce69661ed0ba23b759

Preserved image payload SHA-256 (before = after)d64fbc127a00ac8495f0e9f1d2e9303ab8bc064c840117f90b615fc094ec8d53

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)e97565ee5aaba91a8efec970e82af38332f9af6430b7411f8247c54617854a76

Preserved image payload SHA-256 (before = after)d64fbc127a00ac8495f0e9f1d2e9303ab8bc064c840117f90b615fc094ec8d53

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)39c2dbda3911a418a6eb2784affd82ae2c1c7d1be8340e23a139b5b88a5fce52

Preserved image payload SHA-256 (before = after)d64fbc127a00ac8495f0e9f1d2e9303ab8bc064c840117f90b615fc094ec8d53

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)39c2dbda3911a418a6eb2784affd82ae2c1c7d1be8340e23a139b5b88a5fce52

Preserved image payload SHA-256 (before = after)d64fbc127a00ac8495f0e9f1d2e9303ab8bc064c840117f90b615fc094ec8d53

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}
tiff-deflate3 × 2 · 8 bit · 1 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-25653c2b87ae2b9ab3c53272aa85f043e9521e1e3b3318b70822328387c44957de3

Edit author & GPS

File SHA-256 (changes when metadata changes)7c6cd6c9668828525ae6f2c22ecb13fc950a4b8f6a4c4dc56b2afc302edd8291

Preserved image payload SHA-256 (before = after)c59f3d18d78fbacbe21d480f4061bd2b55b96ded8179aec64a83db94b2927b32

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)865f83c1287ef52ef098858e883f25f04c6eb3ecda22a35072cfd498d6ad8f51

Preserved image payload SHA-256 (before = after)c59f3d18d78fbacbe21d480f4061bd2b55b96ded8179aec64a83db94b2927b32

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)f10e71d74bdfd61347a3a31fdcc6b3b57bec9963e36b652149aa40341e8f8476

Preserved image payload SHA-256 (before = after)c59f3d18d78fbacbe21d480f4061bd2b55b96ded8179aec64a83db94b2927b32

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)f10e71d74bdfd61347a3a31fdcc6b3b57bec9963e36b652149aa40341e8f8476

Preserved image payload SHA-256 (before = after)c59f3d18d78fbacbe21d480f4061bd2b55b96ded8179aec64a83db94b2927b32

Decoded pixel SHA-256 (before = after)fa2a49ee31127d8ee4c2cb49f6cd4837a35560d35f9174bb1becd5c3419abba9

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}
tiff-16bit3 × 2 · 16 bit · 1 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-2561c0fa4bafec22022efadb2b3538b8a8c318a5ca7f66ac64bb723dd798e01ef4c

Edit author & GPS

File SHA-256 (changes when metadata changes)46ad69690adfe0db30610924034dd8f1fb912c5d06d3ea93c5bf9f7cfb31e38e

Preserved image payload SHA-256 (before = after)bb0fc6f8290f7e6ab0a0dd26f62abb19c35a5832580e4b6826cf0fa2eba52220

Decoded pixel SHA-256 (before = after)7ed3e3a5c3163272d60dd4f40e4acc8d753414c1012afc2fd8886267d2228ef2

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)f6304f02f4be43f943a8621e804917a475a09680528c2089e78c9c73a58d12dc

Preserved image payload SHA-256 (before = after)bb0fc6f8290f7e6ab0a0dd26f62abb19c35a5832580e4b6826cf0fa2eba52220

Decoded pixel SHA-256 (before = after)7ed3e3a5c3163272d60dd4f40e4acc8d753414c1012afc2fd8886267d2228ef2

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)faa69504e2ad3535ad05560b6318457dd81c53341f23422d68b2ca3fde7514d1

Preserved image payload SHA-256 (before = after)bb0fc6f8290f7e6ab0a0dd26f62abb19c35a5832580e4b6826cf0fa2eba52220

Decoded pixel SHA-256 (before = after)7ed3e3a5c3163272d60dd4f40e4acc8d753414c1012afc2fd8886267d2228ef2

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)faa69504e2ad3535ad05560b6318457dd81c53341f23422d68b2ca3fde7514d1

Preserved image payload SHA-256 (before = after)bb0fc6f8290f7e6ab0a0dd26f62abb19c35a5832580e4b6826cf0fa2eba52220

Decoded pixel SHA-256 (before = after)7ed3e3a5c3163272d60dd4f40e4acc8d753414c1012afc2fd8886267d2228ef2

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}
tiff-multipage3 × 4 · 8 bit · 2 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-256c1bfc4258e8dde09c00448f5cba4b182d2ed85cce0f3c0f14fd3b586d842543c

Edit author & GPS

File SHA-256 (changes when metadata changes)02a8a0fbfd2203a9669072bd07a8293327da9f8424d25c919834d47aa9b53919

Preserved image payload SHA-256 (before = after)27f1e196ce2b82b7ff7379f7e098b40ec872760d228e964d0d4e891c06ec762a

Decoded pixel SHA-256 (before = after)e3b0e8ac7ce1140fa4c311ccffe0fcd1975dadbda2b9f0cd604b4655a3debe79

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)a72b7060d04fa57ff18ee0e34e917f6730f5f198edf5e632dfc14f88bc415bc3

Preserved image payload SHA-256 (before = after)27f1e196ce2b82b7ff7379f7e098b40ec872760d228e964d0d4e891c06ec762a

Decoded pixel SHA-256 (before = after)e3b0e8ac7ce1140fa4c311ccffe0fcd1975dadbda2b9f0cd604b4655a3debe79

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)077ed0f117fa2f28feea275629e5d266f9b883076ce86133c3e47b1203657915

Preserved image payload SHA-256 (before = after)27f1e196ce2b82b7ff7379f7e098b40ec872760d228e964d0d4e891c06ec762a

Decoded pixel SHA-256 (before = after)e3b0e8ac7ce1140fa4c311ccffe0fcd1975dadbda2b9f0cd604b4655a3debe79

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)077ed0f117fa2f28feea275629e5d266f9b883076ce86133c3e47b1203657915

Preserved image payload SHA-256 (before = after)27f1e196ce2b82b7ff7379f7e098b40ec872760d228e964d0d4e891c06ec762a

Decoded pixel SHA-256 (before = after)e3b0e8ac7ce1140fa4c311ccffe0fcd1975dadbda2b9f0cd604b4655a3debe79

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}
webp-animated3 × 4 · 8 bit · 2 page(s)/frame(s)4 / 4 identical4 / 4 identical
Outputs, tags & SHA-256

Source file SHA-2565bd2afb3c912a73945cdd412c3a93015ae11a6f0c0cdae3c5ee7b035fdef28a6

Edit author & GPS

File SHA-256 (changes when metadata changes)9352262dfbc10b732d14ea45f29b5d8fe91032664b28d5a2886f404135ac93ab

Preserved image payload SHA-256 (before = after)c614c88b272ee9e3995273cc8847d0e3349c7f7cba8e49cb5d2488494ef6db9d

Decoded pixel SHA-256 (before = after)903649ce3cd6c08d95fdfb7f4c6936e48b12ed6b6cf2b42f95b215ea783372ef

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Fidelity Edited",
    "make": "Fidelity Camera",
    "latitude": -33.5,
    "longitude": 151.20000000000002
  }
}

GPS only

File SHA-256 (changes when metadata changes)6f698e94fd0167e98cf017806db65e726a7baf2579e1707f43f2c2f6f55ce7ab

Preserved image payload SHA-256 (before = after)c614c88b272ee9e3995273cc8847d0e3349c7f7cba8e49cb5d2488494ef6db9d

Decoded pixel SHA-256 (before = after)903649ce3cd6c08d95fdfb7f4c6936e48b12ed6b6cf2b42f95b215ea783372ef

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": null,
    "longitude": null
  }
}

EXIF only

File SHA-256 (changes when metadata changes)8ed69399ce6bd718c148671710dd7783a2e4a166091f66c662f010355081d5ff

Preserved image payload SHA-256 (before = after)c614c88b272ee9e3995273cc8847d0e3349c7f7cba8e49cb5d2488494ef6db9d

Decoded pixel SHA-256 (before = after)903649ce3cd6c08d95fdfb7f4c6936e48b12ed6b6cf2b42f95b215ea783372ef

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

All-metadata scope

File SHA-256 (changes when metadata changes)8ed69399ce6bd718c148671710dd7783a2e4a166091f66c662f010355081d5ff

Preserved image payload SHA-256 (before = after)c614c88b272ee9e3995273cc8847d0e3349c7f7cba8e49cb5d2488494ef6db9d

Decoded pixel SHA-256 (before = after)903649ce3cd6c08d95fdfb7f4c6936e48b12ed6b6cf2b42f95b215ea783372ef

Asserted fields before → after

{
  "before": {
    "artist": "Synthetic Author",
    "make": "Synthetic Camera",
    "latitude": 46.5,
    "longitude": 11.8
  },
  "after": {
    "artist": null,
    "make": null,
    "latitude": null,
    "longitude": null
  }
}

Download originals ZIP — All nine entries use STORE and extract to the source SHA-256 hashes in the manifest. Originals retain their source test metadata; edits and removal are not applied.

Reproduce locally without a download plan

  1. Download and extract the complete kit. Use Node.js 22.13 or newer.
  2. Run the following in the extracted directory. Installation downloads the sharp decoder dependency; verification only reads local kit files and does not upload photos.
    npm install
    npm run verify
  3. Expect PASS for 36 transformations and nine byte-identical STORE originals. The script regenerates outputs and compares their bytes with the published files, rather than trusting the results JSON.
  4. You can also import a source and a published output into the viewer to inspect author and GPS fields. Workspace image downloads keep their existing plan rules; evidence files here are directly available for free.

Published checks use sharp 0.35.4 / libvips 8.18.6. The kit pins sharp and prints the actual decoder versions; investigate any pixel differences on another decoder or platform separately.

What exactly is compared?

  • JPEG: compressed scan bytes from the first SOS marker to EOF. PNG: image/animation and selected color chunks. WebP: compressed image, alpha, animation and ICC chunks. Classic TIFF: image strips or tiles for all pages.
  • Decode using sharp separately from the metadata writer; compare raw pixels, dimensions, bit depth, page count and frame delays. The 16-bit sample is compared as ushort, without reducing to 8 bits.
  • Assert expected author, camera and GPS changes. Edited author becomes Fidelity Edited; GPS-only retains author and clears coordinates; EXIF-only and all-metadata scope clear these test fields.
  • The writer snapshot and JPEG/originals-ZIP functions come directly from this site version. Snapshot hashes identify the code tested; this is not third-party certification.

Coverage and limits

These are tiny reproducible synthetic tests, not a study of every camera file. Coverage includes lossy/lossless and animated WebP, LZW/Deflate TIFF, 16-bit and multipage TIFF. BigTIFF, all vendor extensions, malformed directories and large-file stress are excluded.

Fixtures have no orientation rotation and decoding uses no auto-orientation. Removing orientation from other JPEG, PNG or WebP files may change displayed rotation despite identical compressed image bytes. The app previews the first TIFF page; exported edits apply to all pages.

GPS-only removal leaves XMP/IPTC, filenames and visual location clues. The all-metadata scope retains decoding/color data and classic TIFF layout/orientation tags. This page only asserts the listed fields and offers no forensic anonymity guarantee.

For tutorial authors: how to cite

You may cite the results and methods with the fixture coverage and the description “product-authored synthetic test.” Fixture images and transformed copies are dedicated under CC0 1.0 for reuse in tutorials. Code and third-party libraries retain their own terms; see the kit README.

EXIF Studio. Metadata fidelity verification, v1 (2026-10-30). https://exifdesk.com/fidelity-verification#results

Stable citation anchors: #results · #method · #limits. To report a mismatch, include the fixture, operation and Node/decoder versions: support@exifdesk.com.

Inspect fields in the viewer → · Understand removal scopes →