V článku o tom, jak se pozná AI obrázek, jsme skončili doporučením ověřit si, co z metadat přežije váš publikační řetězec. Tak jsem to změřil.
V tomhle testu vyšel výsledek jednoznačně.
Co jsem testoval
Testovací JPEG 1600 × 1000 se dvěma bloky metadat: EXIF (autor, copyright, software, popis) a XMP packet se značkou IPTC DigitalSourceType označující plně vygenerovaný obsah. Tedy deklarace o způsobu vzniku, kterou metadata unesou — ne kryptograficky ověřený důkaz.
Soubor pak prošel knihovnou sharp ve verzi 0.34.5 — tu používá pod kapotou Astro; podobně se nasazuje i v dalších nástrojích v Node.js. Vždy resize({ width: 1200 }) a export s výchozím nastavením enkodéru kromě kvality — jedna běžná varianta publikačního zpracování, ne jediná možná. U JPEG jsem kontroloval APP1 segmenty nesoucí EXIF a XMP a také APP13, u WebP RIFF chunky EXIF a XMP ; přítomnost řetězce trainedAlgorithmicMedia sloužila jen jako doplňková kontrola.
Výsledek
| Varianta | Velikost | Metadata ve výstupu | Deklarace původu |
|---|---|---|---|
| originál | 26 381 B | EXIF + XMP | ano |
| JPEG, výchozí nastavení | 5 557 B | žádná | ne |
| WebP, výchozí nastavení | 1 684 B | žádná | ne |
JPEG s keepMetadata() | 6 250 B | EXIF + XMP | ano |
WebP s keepMetadata() | 2 374 B | EXIF + XMP | ano |
JPEG s keepExif() | 5 833 B | jen EXIF | ne |
JPEG s keepXmp() | 5 974 B | jen XMP | ano |
Jak si to ověřit na vlastním souboru
Samotné zpracování je pár volání. Vezměte obrázek, o kterém víte, co v něm je:
const sharp = require("sharp");
const src = "orig.jpg"; // soubor, o kterém víte, co v něm je
const r = () => sharp(src).resize({ width: 1200 });
await r().jpeg({ quality: 82 }).toFile("a-vychozi.jpg");
await r().webp({ quality: 78 }).toFile("b-vychozi.webp");
await r().keepMetadata().jpeg({ quality: 82 }).toFile("c-keep.jpg");
await r().keepMetadata().webp({ quality: 78 }).toFile("d-keep.webp");
await r().keepExif().jpeg({ quality: 82 }).toFile("e-exif.jpg");
await r().keepXmp().jpeg({ quality: 82 }).toFile("f-xmp.jpg");
Pak oba výstupy otevřete v prohlížeči EXIF a XMP (nebo v exiftoolu) a porovnejte je s originálem. Pokud vás zajímá konkrétně tahle deklarace, hledejte v XMP buď vlastnost DigitalSourceType, nebo její hodnotu trainedAlgorithmicMedia.
Vstupní soubor jsem vyrobil v Pillow, aby bylo jisté, co v něm je:
from PIL import Image
im = Image.new("RGB", (1600, 1000), (40, 70, 160))
exif = Image.Exif()
exif[0x013B] = "Kamil Test" # Artist
exif[0x8298] = "Copyright 2026 Test" # Copyright
xmp = b"""<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/"><rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description xmlns:Iptc4xmpExt="http://iptc.org/std/Iptc4xmpExt/2008-02-29/"
Iptc4xmpExt:DigitalSourceType="http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia"/>
</rdf:RDF></x:xmpmeta><?xpacket end="w"?>"""
im.save("orig.jpg", "JPEG", quality=92, exif=exif.tobytes(), xmp=xmp)
Proč je ten třetí bod důležitý
Kdo hledá v dokumentaci přepínač, narazí nejdřív na EXIF — je to známější pojem a v nastaveních bývá první. Jenže autor, copyright a model fotoaparátu jsou v EXIF, kdežto hodnota z IPTC schématu byla v tomhle testu zapsaná v XMP — ne jako samostatný IPTC IIM blok.
| Aspekt | EXIF | XMP |
|---|---|---|
| Co tam bývá | autor, copyright, přístroj, čas, poloha | popisná schémata včetně IPTC |
| Značka AI původu | není | je |
| Co zachová keepExif() | ano | ne |
| Co zachová keepMetadata() | ano | ano |
Prakticky: kdo si myslí, že „zapnul zachování metadat“, a přitom sáhl jen po EXIF, si nepřenese deklaraci o způsobu vzniku.
Argument o výkonu tady nesedí
Metadata se často zahazují kvůli velikosti, soukromí nebo konzistenci výstupu. V tomhle testu stálo zachování 693 bajtů u JPEG (5 557 → 6 250 B) a 690 bajtů u WebP (1 684 → 2 374 B).
Absolutně je to málo, relativně u WebP hodně — přes 40 % velikosti souboru. Jenže testovací soubor je maličký a syntetický; fotka z fotoaparátu s plnou sadou náhledů, ICC profilů a historie úprav se bude chovat jinak. Tenhle test tedy nedává silnou oporu pro paušální zahazování metadat kvůli velikosti, ale ani netvrdí, že je režie vždy zanedbatelná.
Kdy metadata naopak chcete pryč
Tohle není článek o tom, že se metadata mají zachovávat vždy. Výchozí chování má dobrý důvod:
Čtyři situace, kdy je zahození metadat výhoda
- Poloha z fotoaparátu Fotky z provozovny, z domácí dílny nebo od zákazníka můžou nést souřadnice, které jste publikovat nechtěli.
- Jméno autora u cizích podkladů U klientských fotek a podkladů od dodavatelů bývá v metadatech někdo úplně jiný, než koho na webu uvádíte.
- Sériové číslo a model přístroje Data, která spojí sadu fotek napříč weby s jedním konkrétním zařízením.
- Zbytky z editace Poznámky, popisky a interní údaje z editoru, které se do exportu občas propíšou. Na webu nemají co dělat.
Podstatné je, že je to rozhodnutí, ne náhoda. V tomhle testu to za vás rozhodlo výchozí nastavení sharpu.
Co s tím udělat u sebe
Pětiminutová kontrola vlastního řetězce
- Vezměte obrázek, o kterém víte, co v něm je Fotka rovnou z fotoaparátu nebo soubor, do kterého jste metadata vědomě zapsali.
- Projděte ho celou cestou Nahrát do systému, publikovat, stáhnout výsledek z webu. Ne z administrace — z webu, jak ho vidí návštěvník.
- Porovnejte, co zbylo Stačí prohlížeč EXIF a XMP, například exiftool; na C2PA je potřeba specializovaný nástroj. Zajímá vás rozdíl proti originálu.
- Rozhodněte se vědomě Zachovat u fotek, které mají něco dokládat. Zahodit tam, kde by metadata prozradila víc, než chcete.
Limity tohohle testu
Tři chyby, které se u toho nabízejí
Předpokládat, že se metadata přenášejí
V tomhle testu se ze sledovaných částí nepřeneslo nic — ani EXIF, ani XMP, u JPEG i u WebP.
Řešení: Ve výchozím nastavení se v testu nepřenesla vůbec.
Zapnout zachování EXIF a mít pocit hotova
V testu prošel EXIF a XMP zmizelo — s ním i informace, kvůli které to celé člověk dělá.
Řešení: Značka o původu je v XMP.
Zobecnit tenhle výsledek na všechny systémy
U jiného CMS nebo CDN to může dopadnout jinak. Pětiminutová kontrola výš to zjistí spolehlivěji než analogie.
Řešení: Testovaná byla jedna knihovna.
Shrnutí
- V testu na knihovně sharp 0.34.5 výchozí nastavení nepřeneslo do výstupu EXIF ani XMP — u JPEG i u WebP.
keepMetadata()obojí zachovalo, včetně deklarace o původu, a to i po konverzi do WebP.keepExif()deklaraci o původu nezachránil — seděla v XMP, ne v EXIF.- Zachování stálo 693 B u JPEG a 690 B u WebP — absolutně málo, u malého WebP ale přes 40 % velikosti.
- Zahazovat metadata je někdy správně. Má to ale být rozhodnutí, ne výchozí nastavení, o kterém nevíte.
- Test platí pro jednu knihovnu, jeden soubor a pro EXIF s XMP; C2PA ani jiné systémy netestoval.