# Application-photo test fixture

Created 5 September 2026. This is a synthetic color chart, not a portrait, identity document, or application submission. It exists to make HEIC-to-JPEG processing inspectable without personal data.

- Source: [the existing 600 × 600 PNG color chart](../resize-image-to-kb/synthetic-color-chart.png), created by JPEGConvert’s deterministic synthetic benchmark. See its [method and CC0 dedication](../resize-image-to-kb/README.md).
- HEIC: [synthetic-color-chart.heic](./synthetic-color-chart.heic), 600 × 600 pixels, encoded with libheif/heif-enc 1.19.5 at quality 90. The file has no embedded personal metadata.
- [Fixture hashes and exact bytes](./fixture.json).

The HEIC is a real HEVC-encoded image, not a renamed JPEG. It may need an HEIC-capable viewer. The application tool decodes it to an intermediate PNG through the existing HEIC loader, then encodes and checks a JPEG.

To reproduce from the repository root with libheif installed:

```sh
heif-enc -q 90 -o webapp/src/public/samples/application-photo/synthetic-color-chart.heic webapp/src/public/samples/resize-image-to-kb/synthetic-color-chart.png
heif-info webapp/src/public/samples/application-photo/synthetic-color-chart.heic
```

Encoder versions can change the exact bytes. Reproducing the file is not required to use or test the checked-in fixture.

The browser scenario `webapp/tests/ui/application-photo-scenario.mjs` exercises both BREBR fields, the SSCASN KTP preset, and this HEIC through the My Number preset. It downloads the actual JPGs, independently decodes their bytes, checks sizes and pixels, and writes measurements to a temporary directory printed in its output. It also checks independent photo/signature state and a 300 × 300 source that must fail Japan’s 480-pixel minimum.

The related [public engine benchmark](../resize-image-to-kb/benchmark.json) records measured examples for the shared sizing engine. Those measurements are not claims about every regional preset or every source image. Different browser encoders may produce different byte counts.

## Measured regional examples

[measurements.json](./measurements.json) records four actual JPEG downloads, including the measurement date and browser version, source/output SHA-256 hashes, exact bytes, decoded dimensions, preset settings, and the official sources. The source and output files are public so the numbers can be checked independently.

- [BREBR photo-field example](./brebr-photo.jpg): synthetic chart.
- [BREBR signature-field example](./brebr-signature.jpg): synthetic pen-like marks.
- [SSCASN KTP-field example](./sscasn-ktp.jpg): synthetic chart.
- [My Number HEIC-to-JPEG example](./mynumber-heic-to-jpg.jpg): synthetic HEIC chart.

The terms “photo field,” “signature field,” and “KTP field” identify the tested preset. These generated images are not suitable application content.

To repeat the UI measurements, from `webapp/` with Node 22, installed dependencies, and Google Chrome:

```sh
UI_SMOKE_PORT=4189 UI_SMOKE_FILTER=prepare-application-photo npm run test:ui-smoke:quick
```

The scenario prints a temporary directory containing the measured downloads, screenshots, and its `measurements.json`. Ordinary test runs do not overwrite the public examples. To intentionally publish a reviewed passing run, use the printed report path:

```sh
node scripts/publish-application-photo-evidence.mjs /path/to/printed/measurements.json
```

The publisher verifies input/output hashes and JPEG properties before copying the four synthetic outputs and regenerating the page’s example data. Rebuild the site after publishing. `npm run test:application-photo` checks the public hashes, recorded dimensions, and preset limits so a changed fixture cannot silently inherit an earlier measurement.

To the extent permitted by law, JPEGConvert contributors dedicate this derived synthetic HEIC fixture and accompanying fixture data to the public domain under [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/). No third-party photograph or personal data was used. Passing file checks does not establish acceptable content, legibility, or portal acceptance.
