Practical guide
Exact duplicate files versus decoded pixel matches
Two files can have different bytes and still decode to the same defined image. Start by grouping exact file copies, then use a separate pixel comparison when metadata, orientation or compression may differ.
18 October 2026 · Check AI Free
Group the files by exact bytes first
Step 1
Run the controlled duplicate set
Open Find exact duplicate files and click Try duplicate and same-name samples. file-001 is same-name.png and file-002 is renamed-copy.png; these contain the same bytes. file-003 is also named same-name.png but contains the metadata variant. Names do not determine the groups.
Step 2
Inspect every row before exporting
Expect one group containing file-001 and file-002; file-003 stays separate. SHA-256 matches are additionally compared byte for byte against a re-read representative. Read failures remain per-file rows. Review Preview duplicate report JSON, then Download duplicate JSON; local filenames are excluded unless you explicitly include them.
Step 3
Respect batch and cancellation limits
The batch permits 20 files, 100 MiB total and 20 MiB per file, read sequentially. Cancel preserves completed results and marks remaining rows canceled. No disk original is deleted, and this operation does not group visually similar re-encodes.
- Download the original synthetic RGBA PNG — Project-authored 8 × 6 PNG, 338 bytes. Four colored regions, alpha controls and one Description tEXt field: Fictional metadata; pixel samples are unchanged. This canonical download differs from the separate 266-byte built-in hash sample.
- Download the verified metadata text replacement — 330-byte output replacing original.png chunk-2 Description with “Edited locally for the SHA-256 exercise.” using tEXt. Original IDAT is retained; independent decoded samples match.
Compare the same-picture metadata pair separately
Step 1
Choose the pair with known pixel samples
In Compare image files select Same pixels, different metadata and click Try comparison pair. Alternatively choose original.png and metadata-edit.png as First file and Second file, then Compare files. The built-in pair is 266 and 338 bytes. The canonical downloads original.png and metadata-edit.png are instead the actual 338-to-330-byte text-replacement pair. Both pairs have different hashes and matching independent decoded samples; do not use one pair’s expected file hash for the other.
Step 2
Read the two results independently
Original file bytes should be different; the independent Pillow reference has identical oriented sRGB RGBA for this pair. Read the actual browser result under its displayed fixed policy and preserve that policy with the report. A match is scoped to this browser decode and does not establish common authorship or generation history.
Step 3
Save a report or locate an actual difference
Use Download comparison JSON to keep both hashes, decode statuses and policy. For One changed pixel, the reference difference is at zero-based (5, 3), with one changed red channel and maximum delta 15. A successful browser comparison provides a native-size magenta difference PNG, its change bounds and up to 20 coordinate/value pairs. Download difference PNG only after its encoding and re-read succeed.
- Download the one-pixel difference control — Same 8 × 6 chart in a 266-byte PNG without the Description field. The red channel at zero-based (5, 3) changes from 240 to 255; independent Pillow locates exactly one changed pixel.
Keep the pixel conditions with the result
The comparer uses native-size 8-bit Canvas sRGB RGBA. Valid EXIF orientation is removed from the decoder input and applied exactly once; missing EXIF uses orientation 1, and XMP orientation is ignored. Embedded color declarations/profiles enter the browser color pipeline. Alpha is compared. RGB under alpha zero is normalized to zero because Canvas cannot retain hidden transparent RGB; partially transparent colors may be quantized.
Different display dimensions are reported without resizing or claiming a pixel match. The decode path rejects animation, multi-picture JPEG, invalid orientation and inputs exceeding 16 million pixels or 8192 pixels on a side. A failed or unsupported decode can still have a valid byte hash, while its pixel equality remains unknown. Browser acceptance is limited to Chromium; Safari and Firefox have not been checked.
- WHATWG HTML Canvas source, revision de953a7cf052 — Primary specification snapshot checked 18 October 2026, including Canvas color spaces and ImageData. The site's native-size, 8-bit sRGB RGBA and transparent-RGB policy is stated separately.
- CIPA Exif 2.3 corrected reference, 2012 — Fixed primary reference for the Orientation tag and encoded image organization. The tools' supported fields are narrower than the complete standard; this is not a claim that 2.3 is the current Exif edition.
Try controls that answer different questions
The pinned Chromium JPEG control also produced 12,717 changed pixels. A separate wide-profile versus LittleCMS-converted control differed at eight pixels/eight channels with maximum delta 1; color pipelines can differ. The independent counts are fixture evidence, not a perceptual similarity score or a forgery assessment. Keep the actual browser report when counts matter; independent reference counts do not substitute for a reading of the files you select. A matching hash or decoded pixel buffer does not certify provenance.
| Synthetic pair | Independent reference | Interpretation |
|---|---|---|
| Same pixels, different metadata | Different hashes; identical RGBA | Container bytes changed; this does not locate a picture edit. |
| EXIF rotation / physically rotated PNG | Identical oriented 6 × 8 RGBA | Apply a defined orientation policy before comparing. |
| One changed alpha value | One changed pixel at (6, 1); alpha delta 64 | Transparency is part of RGBA; it is not composited onto white. |
| Different native dimensions | 8 × 6 versus 7 × 6; not compared | Do not resize both to a thumbnail and call the originals equal. |
| Own sRGB profile / no profile | Same reference RGBA for this narrow pair | This does not imply that removing arbitrary ICC profiles preserves color. |
| JPEG quality 75 re-encoding | Pillow finds 12,717 changed pixels | Recompression can change decoded values; counts remain decoder-dependent. |
Sources and reproducible inputs
- Download the original synthetic RGBA PNG — Project-authored 8 × 6 PNG, 338 bytes. Four colored regions, alpha controls and one Description tEXt field: Fictional metadata; pixel samples are unchanged. This canonical download differs from the separate 266-byte built-in hash sample.
- Download the verified metadata text replacement — 330-byte output replacing original.png chunk-2 Description with “Edited locally for the SHA-256 exercise.” using tEXt. Original IDAT is retained; independent decoded samples match.
- Download the one-pixel difference control — Same 8 × 6 chart in a 266-byte PNG without the Description field. The red channel at zero-based (5, 3) changes from 240 to 255; independent Pillow locates exactly one changed pixel.
- NIST FIPS 180-4, August 2015 — Fixed Secure Hash Standard used for SHA-256. A content digest identifies bytes; this workflow does not add identity authentication or signature validation.
- WHATWG HTML Canvas source, revision de953a7cf052 — Primary specification snapshot checked 18 October 2026, including Canvas color spaces and ImageData. The site's native-size, 8-bit sRGB RGBA and transparent-RGB policy is stated separately.
Continue with your file
- Explain a metadata-only hash change — A specified text replacement gives reproducible before/after file identities.
- Choose format, dimension or identity checks — Start with the input and the output you actually need.