Export behavior · Controlled example

A byte copy and a fresh PNG export retain different records

The byte copy retains the reference hash and prompt. The tested PNG re-encode preserves pixels and loses the supported prompt record.

Does exporting a PNG preserve its saved generation details?

In this exact sharp PNG re-encode, the pixels stay equal while the saved prompt becomes unreadable. A direct byte copy preserves both the original hash and saved fields.

How the case was made

We create one Buffer copy and one sharp(...).png().toBuffer() export from the reference file. We compare file bytes, decoded pixels and saved creation fields separately.

Code-drawn geometric test image used for the controlled metadata examples
The same code-drawn source picture is used across the fixtures. The saved demonstration prompts do not describe how these pixels were made.

Files and observed output

  • parameters-tEXt.png · 13,371 bytesSHA-256: e76d2af4e6c273e1ba8ca6cf2b5b7885ceda2321bce893f0bb5f9e64ace17c9f
  • original-copy.png · 13,371 bytesSHA-256: e76d2af4e6c273e1ba8ca6cf2b5b7885ceda2321bce893f0bb5f9e64ace17c9f
  • reencoded.png · 13,179 bytesSHA-256: acdc3a0a5e011cf57af9bf0f1da74c75c2d280a2cc9af9297410c529f86932cf
Recorded result
[
  {
    "before_file": "parameters-tEXt.png",
    "after_file": "original-copy.png",
    "identical_file_bytes": true,
    "decoded_rgba_pixels_equal": true,
    "fields": [
      {
        "field": "prompt",
        "before": "Controlled example: a paper boat on a blue table",
        "after": "Controlled example: a paper boat on a blue table",
        "state": "same"
      },
      {
        "field": "seed",
        "before": "42",
        "after": "42",
        "state": "same"
      },
      {
        "field": "steps",
        "before": 20,
        "after": 20,
        "state": "same"
      },
      {
        "field": "generation_width",
        "before": 1024,
        "after": 1024,
        "state": "same"
      },
      {
        "field": "generation_height",
        "before": 768,
        "after": 768,
        "state": "same"
      }
    ]
  },
  {
    "before_file": "parameters-tEXt.png",
    "after_file": "reencoded.png",
    "identical_file_bytes": false,
    "decoded_rgba_pixels_equal": true,
    "fields": [
      {
        "field": "prompt",
        "before": "Controlled example: a paper boat on a blue table",
        "after": null,
        "state": "unreadable_after"
      },
      {
        "field": "seed",
        "before": "42",
        "after": null,
        "state": "unreadable_after"
      },
      {
        "field": "steps",
        "before": 20,
        "after": null,
        "state": "unreadable_after"
      },
      {
        "field": "generation_width",
        "before": 1024,
        "after": null,
        "state": "unreadable_after"
      },
      {
        "field": "generation_height",
        "before": 768,
        "after": null,
        "state": "unreadable_after"
      }
    ]
  }
]

Observations recorded 2026-09-19 using Node v23.11.0 and sharp 0.35.4. JSON seed values are strings to retain integer precision. A null prompt means the reader did not return a supported saved prompt.

Reproduce this result

  1. Download the files above and verify their SHA-256 hashes.
  2. Open the linked isGenAI tool and choose the corresponding file, or the before/after pair for comparisons.
  3. Compare the returned fields with the recorded output. Different tool versions or altered files can produce different results.

The standalone reproduction script creates the fixture variants and compares bytes and pixels. The complete JSON observations also include parser results. Use the workflow and comparison API examples to inspect downloaded files programmatically.

Read the format guide and its primary sources.

What this result does not establish

This result is specific to the recorded export procedure and dependency version. It does not describe every editor, screenshot utility or social platform, and does not certify metadata removal for privacy.

Files and observations: CC0-1.0. Cite this case URL and include its method and limits. Report a reproducibility issue.