mirror of
https://github.com/wiltodelta/remove-ai-watermarks.git
synced 2026-10-14 13:30:55 +02:00
pillow-heif's opener rewrites the EXIF orientation to 1 and stashes the real value in info["original_orientation"], while libheif turns the raster on decode exactly when the container declares an effective irot/imir transform. A camera HEIC (stored raster, EXIF-only rotation) and a re-encoded one (rotation baked as irot) both decode with Image.size matching the raster and the tag blanked, so _read_display_tags dropped the turn for both (issue #105): a camera HEIC went through erase and came out sideways with nothing on it saying so. For HEIF the caller's orientation_applied claim is now ignored the way it is for TIFF, and the container decides: isobmff.heif_transform_applied scans meta/iprp/ipco for an irot with a non-zero angle or any imir, the orientation comes from original_orientation, and a transform-bearing file drops the tag. AVIF keeps the generic path: this plugin build neither blanks its tag nor applies the transform there, and a camera-style AVIF's orientation stays unreachable from Pillow (recorded in known-limitations). Tests build the camera fixture without exiftool: a pillow-heif-written file with its irot angle neutralized to the identity behaves like the reporter's exiftool-built camera file. Mutation-checked in both directions: forcing the detector either way fails exactly the tests whose property broke. pre-commit: 1) maintain.sh - exit 2 at the uv-secure gate, the three triaged no-fix advisories in docs/development.md (rechecked 2026-09-09: accelerate 1.15.0 and lightning 2.6.5 still carry no fix); ruff check+format clean, pyright src/ 0 errors, 2368 passed 3 skipped run separately; 2) /simplify - single pass, no fan-out available, one duplicate test helper inlined, no other findings; 3) docs sync - heif_transform_applied, original_orientation, irot, imir live only in module-internals.md and known-limitations.md, both updated, no other refs; 4) CLAUDE.md - audited against the structure rule, no additions; revise-claude-md: no CLAUDE.md changes