check / check (push) Successful in 1m21s
photo.exif() and backup-metadata --exif read EXIF with exifreader, which reads JPEG, HEIC/HEIF, AVIF, PNG and WebP, so a HEIC original or a live photo's HEIC image gets its EXIF. exifreader replaces exif-reader and the hand-written JPEG segment scan. PhotoExif is unchanged. The exif field of backup-metadata --exif is now exifreader's tag output, and exifRaw holds the whole EXIF block it could not read. Tests use a real 933-byte HEIC fixture, test/exif.heic, whose recipe is in test/exif-heic.ts. Model: opus-5-5
28 lines
1.1 KiB
TypeScript
28 lines
1.1 KiB
TypeScript
/**
|
|
* `exif.heic`, beside this file: a real 64x64 HEIC whose EXIF holds the same
|
|
* values as the hand-built JPEG in `library/content-library.test.ts`, for the
|
|
* tests of `exif()` and `backup-metadata --exif`.
|
|
*
|
|
* It was made once, in a throwaway node:22-alpine container (Alpine 3.23.3),
|
|
* with libheif 1.23.0 and exiftool 13.55:
|
|
*
|
|
* apk add libheif-tools exiftool imagemagick
|
|
* magick -size 64x64 gradient:red-blue -depth 8 in.png
|
|
* heif-enc -q 30 -o exif.heic in.png
|
|
* exiftool -overwrite_original \
|
|
* -Make=Canon -Model="EOS R5" -LensModel="RF50mm F1.8 STM" \
|
|
* -DateTimeOriginal="2021:07:15 14:30:00" -OffsetTimeOriginal="+02:00" \
|
|
* -ExposureTime=1/250 -FNumber=2.8 -ISO=400 -FocalLength=50 \
|
|
* -Orientation#=6 \
|
|
* -GPSLatitude="40 26 46" -GPSLatitudeRef=N \
|
|
* -GPSLongitude="79 58 56" -GPSLongitudeRef=W \
|
|
* -GPSAltitude=12.5 -GPSAltitudeRef#=1 \
|
|
* exif.heic
|
|
*/
|
|
|
|
import { readFileSync } from "node:fs";
|
|
|
|
export const HEIC_WITH_EXIF = new Uint8Array(
|
|
readFileSync(new URL("exif.heic", import.meta.url)),
|
|
);
|