check / check (push) Successful in 2m10s
`photo.exif()` and `quak backup-metadata --exif` now read EXIF through `exifreader`. HEIC/HEIF originals get EXIF, including a live photo's image, as do the other formats `exifreader` reads. It replaces `exif-reader` and the hand-written JPEG scan. `PhotoExif` is unchanged. The `backup-metadata` dump now holds `exifreader`'s tag output, with unnamed tags keyed `undefined-` plus their number. GPS altitude without a reference counts as above sea level. A latitude or longitude without its hemisphere tag, an unreadable text tag, and a date the parser rejects each give no field. Licence: `exifreader` is MPL-2.0, used unmodified. 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)),
|
|
);
|