mirror of
https://github.com/wiltodelta/remove-ai-watermarks.git
synced 2026-08-06 22:18:36 +02:00
Bug fixes (each with a regression test): - metadata strip parity across every marker placement: IPTC digitalSourceType in XMP, the Samsung post-EOI trailer, the China TC260 AIGC block in EXIF UserComment, a bare AIGC block in a non-standard APP segment, and the ISOBMFF EXIF path (AIGC + xAI) are all now stripped -- anything a scanner flags, the strip reaches - Samsung genAIType detected when its trailer sits past the 512 KB scan window (file-tail read on large photos) - crashes on edge inputs: Gemini detector on images with a short side < 16px, footprint_mask on a zero-size ndarray, the humanizer on chromatic_shift >= width, and the CLI on unreadable/corrupt/empty input (clean error, not a traceback) - WebP written losslessly (cv2 quality 101), not lossy at 100 - the IPTC digitalSourceType algorithmicMedia (procedural, not trained on sampled data) is no longer flagged as AI-generated, so clean procedural content is not scrubbed - c2pa source-type: compositeWithTrainedAlgorithmicMedia is checked before the bare algorithmicMedia token, so an AI-enhanced composite is not misclassified Detection: - integrity-clash coverage now normalizes ByteDance / Canva / ElevenLabs / Black Forest Labs, so a transplanted manifest next to an independent conflicting stamp is caught; the generic China TC260 AIGC label is attributed to a co-present TC260 vendor, so a legit Doubao image (its own C2PA + TC260 label) does not clash (corpus-validated: 0 new clashes on 5000 carriers) CLI: - batch exits non-zero (with a warning) when any image errors or a GPU-missing SynthID scrub is skipped, and copies the input through so the output dir stays complete -- it used to always exit 0 and could silently drop files Perf: - GeminiEngine reused as a process-wide singleton with a precomputed template ladder: -24% on the identify sparkle path, detection byte-identical Internal: one shared _ai_exif_targets rule set feeds both EXIF scrubbers so their coverage cannot drift; docs synced; maintain.sh hardened so the uv-secure internal teardown crash no longer aborts the gate (still fails on a real finding). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
26 lines
819 B
Python
26 lines
819 B
Python
"""Minimal local type stub for the untyped ``piexif`` package.
|
|
|
|
Covers only the API surface used in this repo (``load``/``dump`` plus the
|
|
``ImageIFD`` tag ids), so strict pyright resolves the otherwise-Unknown values
|
|
that ``piexif.load`` returns instead of carrying type debt. piexif ships no
|
|
``py.typed`` marker; extend this stub if new piexif APIs are adopted.
|
|
"""
|
|
|
|
from typing import Any
|
|
|
|
class ImageIFD:
|
|
Software: int
|
|
Make: int
|
|
Artist: int
|
|
ImageDescription: int
|
|
|
|
class ExifIFD:
|
|
UserComment: int
|
|
|
|
class GPSIFD: ...
|
|
|
|
def load(input_data: bytes | str, key_is_name: bool = ...) -> dict[str, Any]: ...
|
|
def dump(exif_dict_original: dict[str, Any]) -> bytes: ...
|
|
def insert(exif: bytes, image: str, new_file: str | None = ...) -> None: ...
|
|
def remove(src: str, new_file: str | None = ...) -> None: ...
|