# PNG→AVIF original experiment — October 30, 2026

All images are original synthetic fixtures. Install Pillow 12.3.0 and NumPy 2.3.5, then run `python generate-fixtures.py --out fixtures`. The generator writes six valid sources, seven deliberate rejection controls and one cancel control. The two larger controls are generated locally rather than hosted.

Open https://filepetal.com/png-to-avif/ in your browser. Select each PNG, choose the mode and quality listed in verification.json, convert and save the actual offered AVIF. This run used @jsquash/avif 2.1.1, speed 6, 8-bit input to the encoder and qualityAlpha 100 (the SDK configures its own alpha setting in lossless mode). Defaults otherwise come from that pinned package. Quality 100 is tested separately from lossless=true.

Independently decode actual AVIF downloads with Pillow and compare RGBA arrays to Pillow decoding of each original PNG. The `*-q*.png` and `*-lossless.png` files are decoded views of actual AVIFs, not alternate converter outputs. Pixel comparisons in the page table count RGB differences only where source alpha is 255. Full RGBA and alpha counts are in verification.json. Browser canvas processing can change hidden RGB and partly transparent RGB before encoding.

The exact AVIF bytes can vary in other environments. Hashes identify these actual files, not a general quality grade. This run covers one desktop browser, no competitor conversions, physical phones, other browsers, HDR/wide-gamut accuracy, profile or metadata round trips, resize, batch or animation encoding.
