# GIF to PNG reproducible tests

Test date: October 16, 2026. All input artwork is original CC0 synthetic material.

Download a GIF input and select it at https://filepetal.com/gif-to-png/. Convert, inspect and download the PNG. Compare with the paired PNG and verification.json: dimensions, byte length and full SHA-256 are recorded. No animation, frame-picker, image-sequence or background-removal feature is implied.

Use Python and Pillow 11.3.0 to run generate-fixtures.py in an empty folder. It writes generated-gif-fixtures. Compare the regenerated GIF hashes with SHA256SUMS.txt before claiming exact reproduction. Pillow/encoder versions may change compressed bytes.

Independent inspection: open each input with Pillow, seek(0), convert('RGBA'); open the saved output and convert('RGBA'). Compare dimensions and decoded RGBA, ignoring RGB under fully transparent pixels when comparing visible content. Inspect alpha extrema and distinct visible colors. The recorded six browser outputs match the first Pillow frame, including hidden RGB in this browser run. PNG byte encoding can vary between browsers.

Cases: two-frames.gif has coral then green with 300/700ms delays; blank-first.gif has a transparent first frame; opaque-index-zero.gif uses black index zero without a transparency flag; sixteen-gray.gif has sixteen gray bands; disposal-three.gif contains later restore-to-previous behavior but only its first frame is exported; one-pixel.gif tests 1x1. Disposal later in an animation is not reconstructed by this still converter.

Error samples: fake.gif is plain text, truncated.gif is the first30 bytes of a GIF, over-side.gif is4097x1. Actual browser errors are recorded in verification.json. This is not exhaustive malformed-file testing. Existing20MB/4096-side/16-million-pixel limits were not changed.
