JPEG
en çok sızdıranBir JPEG dosyası meta verilerini, dosya başlığıyla görsel verisi arasındaki APPn segmentlerinde taşır. İşte neyin nerede durduğu ve PicScrub'ın her parçaya ne yaptığı.
Neler siliniyor
- EXIF GPS koordinatları, kameranın markası ve modeli, tarih ve saat, pozlama ayarları
- XMP düzenleme geçmişi, kullanılan yazılım, puanlamalar
- IPTC / Photoshop fotoğraf altı yazıları, künyeler, anahtar kelimeler
- Yorumlar ve gömülü küçük resimler orijinalin, senin kırpmalarına ve düzenlemelerine rağmen hayatta kalabilen minik bir kopyası
Neleri koruyabilirsin
- Görsel verisi her zaman olduğu gibi kalır, asla yeniden kodlanmaz
- ICC renk profili isteğe bağlı, renkler bozulmasın diye
- Yön isteğe bağlı, dikey fotoğraflar yan dönmesin diye
- Telif hakkı bildirimi isteğe bağlı, koordinat vermeden künyesini isteyen fotoğrafçılar için
Dosya yapısına genel bakış
Daha önce bir JPEG dosyasını hex editörde açtıysan, dosyanın işaretleyicilerle ayrılmış segmentlerden oluştuğunu fark etmişsindir. Her işaretleyici 0xFF ile başlar, hemen ardından segmentin türünü söyleyen bir bayt gelir. Bu tasarım, JPEG dosyalarını çözümlemeyi görece kolaylaştırır: FF baytlarını tarar ve arkasından ne geldiğine bakarsın.
Gizlilik açısından asıl ilginç olan kısım, bütün meta verilerin (EXIF, GPS, tarih ve saat) bu segmentlerde, asıl görsel verisinden tamamen ayrı durması. Meta verileri piksellere dokunmadan ve hiçbir şeyi yeniden sıkıştırmadan silebilmemizin sebebi de bu.
JPEG dosya yapısı
JPEG başlığı örneği
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
İşaretleyicinin yapısı
FF xx:İşaretleyici (xx türü belirtir)LL LL:Uzunluk (2 bayt, big-endian, kendisi de dahil)Data...:Segment verisi (uzunluk - 2 bayt)
JPEG işaretleyicilerinin tam listesi
| İşaretleyici | Ad | Açıklama |
|---|---|---|
| FF D8 | SOI | Görsel başlangıcı |
| FF D9 | EOI | Görsel sonu |
| FF C0 | SOF0 | Kare başlangıcı (baseline DCT) |
| FF C2 | SOF2 | Kare başlangıcı (progressive DCT) |
| FF C4 | DHT | Huffman tablosu tanımı |
| FF DB | DQT | Nicemleme tablosu tanımı |
| FF DD | DRI | Yeniden başlatma aralığı tanımı |
| FF DA | SOS | Tarama başlangıcı (görsel verisi buradan sonra gelir) |
| FF FE | COM | Yorum (meta veri) |
| FF E0 | APP0 | JFIF işaretleyicisi |
| FF E1 | APP1 | EXIF / XMP işaretleyicisi |
| FF E2 | APP2 | ICC profili / MPF |
| FF ED | APP13 | IPTC / Photoshop |
| FF EE | APP14 | Adobe renk dönüşümü |
Altın rengi = meta veri (silinir), düz satırlar = kalan yapı
JFIF ve EXIF
Çok kişinin kafasını karıştıran bir şey var: JPEG dosyaları çoğu zaman aynı anda iki farklı meta veri standardı taşır. Önce JFIF geldi ve çözünürlük gibi temel bilgilerle ilgilendi. Sonra kameralar, çekimin bütün ayrıntılarını içeren EXIF verilerini eklemeye başladı. Modern JPEG dosyalarının çoğunda ikisi de bulunur, dosyanın başında hem APP0 hem APP1 işaretleyicisi görmenin sebebi de bu.
APP0:JFIF
JPEG File Interchange Format. Temel görsel bilgileri.
- • Sürüm numarası
- • Piksel yoğunluğu (DPI)
- • En boy oranı
- • İsteğe bağlı küçük resim
APP1:EXIF
Exchangeable Image File Format. Kameranın meta verileri.
- • Kameranın markası ve modeli
- • GPS koordinatları
- • Tarih ve saat
- • Pozlama ayarları
APP işaretleyicileri derinlemesine
JPEG standardı, üreticiler istedikleri gibi kullansın diye 16 tane "uygulama" işaretleyicisi ayırdı (APP0'dan APP15'e kadar). Yıllar içinde farklı kurumlar kendi meta veri formatları için farklı işaretleyicileri sahiplendi. Ortaya biraz dağınık bir tablo çıktı ama en azından iyi belgelenmiş bir dağınıklık.
İşin can sıkıcı tarafı, aynı işaretleyicinin içeriğine göre farklı anlamlara gelebilmesi. Örneğin APP1 hem EXIF hem de XMP verisi olabilir, bu yüzden hangisiyle uğraştığını anlamak için içindeki tanımlayıcı metne bakman gerekir.
APP0 (0xFFE0):JFIF
Tanımlayıcı: JFIF\0. Sürüm, yoğunluk birimleri, X/Y yoğunluğu ve isteğe bağlı gömülü bir küçük resim içerir. Genellikle korumakta sakınca yoktur.
APP1 (0xFFE1):EXIF
Tanımlayıcı: Exif\0\0. Kamera bilgileri, GPS verileri, tarih ve saat, küçük resimler ve üretici notları için IFD girdilerinden oluşan eksiksiz bir TIFF yapısı içerir. Gizlilik açısından bir numaralı sorun.
APP1 (0xFFE1):XMP
Tanımlayıcı: http://ns.adobe.com/xap/1.0/\0. Adobe'nin XML tabanlı meta veri standardı. Düzenleme geçmişi, yazılım bilgileri ve genişletilmiş EXIF verileri içerebilir.
XMP ad alanları
xmp: http://ns.adobe.com/xap/1.0/xmpMM: http://ns.adobe.com/xap/1.0/mm/dc: http://purl.org/dc/elements/1.1/photoshop: http://ns.adobe.com/photoshop/1.0/tiff: http://ns.adobe.com/tiff/1.0/exif: http://ns.adobe.com/exif/1.0/APP1 (0xFFE1):Genişletilmiş XMP
Tanımlayıcı: http://ns.adobe.com/xmp/extension/\0. 65 KB'ı aşan XMP verileri için, birden fazla APP1 segmentine bölünür.
APP2 (0xFFE2):MPF
Tanımlayıcı: MPF\0. Stereoskopik görseller ve panoramalar için Multi-Picture Format.
APP2 (0xFFE2):ICC profili
Tanımlayıcı: ICC_PROFILE\0. Renk yönetimi verisi. Birden fazla APP2 işaretleyicisine bölünmüş olabilir. Genellikle korumakta sakınca yoktur.
APP13 (0xFFED):IPTC/Photoshop
Tanımlayıcı: Photoshop 3.0\0. Fotoğraf altı yazıları, anahtar kelimeler, telif hakkı ve içeriği üreten kişi bilgileriyle IPTC-IIM verisi içerir. Yazar bilgisi barındırabilir.
APP14 (0xFFEE):Adobe
Tanımlayıcı: Adobe\0. Renk dönüşümü bayraklarını (RGB/CMYK) içerir. Renklerin doğru görüntülenmesi için önemlidir.
EXIF yapısı
İşler burada ilginçleşiyor (ve biraz tuhaflaşıyor). EXIF verisi aslında JPEG'inin içine gömülmüş minicik bir TIFF dosyası. Evet, gerçekten öyle. Kendi başlığı ve kendi bayt sırası var, etiketleri saklamak için de TIFF'in IFD (Image File Directory) yapısını kullanıyor.
"Exif" tanımlayıcısından sonra göreceğin ilk şey, verinin little-endian (Intel, "II") mi yoksa big-endian (Motorola, "MM") mi olduğunu söyleyen bir TIFF başlığıdır. Bunu yanlış okursan bütün sayılar çöpe döner, o yüzden her çözümleyicinin ilk baktığı şey budur.
TIFF başlığı (8 bayt)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (little-endian), MM = Motorola (big-endian)
IFD girdisinin yapısı (12 bayt)
Öne çıkan IFD girdileri
0x010F:Make0x0110:Model0x0132:DateTime0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0x927C:MakerNotePicScrub JPEG dosyalarını nasıl işliyor
Yöntem oldukça basit: dosyayı işaretleyici işaretleyici okuyoruz, görselin görüntülenmesi için gerekli olanları tutuyoruz, meta veri içerenleri atlıyoruz. Sıkıştırılmış görsel verisine hiç dokunmadığımız için sıfır kalite kaybı oluyor.
İşin püf noktası, JPEG'in işaretleyici tabanlı yapısının bunu kolaylaştırması. DCT katsayılarını ya da Huffman tablolarını anlamamıza gerek yok. Sadece hangi segmentin meta veri olduğunu, hangisinin olmadığını ayırt etmemiz yeterli.
Başlığı doğrula
Dosyanın başındaki SOI işaretleyicisini (FF D8) kontrol et
İşaretleyicileri çözümle
Her işaretleyiciyi sırayla oku, türünü ve uzunluğunu çıkar
Meta verileri tespit et
APP segmentlerindeki tanımlayıcıları kontrol et (EXIF, XMP, IPTC vb.)
Seçerek kopyala
Meta veri olmayan segmentleri çıktıya kopyala, meta veri segmentlerini atla
Neler korunuyor
- • SOI/EOI işaretleyicileri (zorunlu)
- • DQT (nicemleme tabloları)
- • SOF (kare başlığı)
- • DHT (Huffman tabloları)
- • SOS ve tarama verisi (asıl görsel)
- • İsteğe bağlı: ICC renk profili (ayarlanabilir)
Neler siliniyor
- • APP1 EXIF (kamera, GPS, tarih ve saat)
- • APP1 XMP (düzenleme meta verileri)
- • APP13 IPTC (fotoğraf altı yazıları, yazar)
- • COM işaretleyicileri (yorumlar)
- • EXIF küçük resimleri
EXIF etiket listesi
Gizlilik söz konusu olduğunda bütün EXIF etiketleri aynı ağırlıkta değil. Pozlama ayarları gibi bazıları epey zararsız. Seri numaraları ve sahip adları gibi bazıları ise doğrudan seni ya da ekipmanını tanımlayabiliyor. Yüksek riskli saydıklarımız şunlar:
| Etiket ID | Ad | Gizlilik riski |
|---|---|---|
| 0x9003 | DateTimeOriginal | Yüksek |
| 0x9004 | DateTimeDigitized | Yüksek |
| 0x9010 | OffsetTime | Orta |
| 0x9286 | UserComment | Yüksek |
| 0x927C | MakerNote | Yüksek |
| 0xA420 | ImageUniqueID | Yüksek |
| 0xA430 | CameraOwnerName | Yüksek |
| 0xA431 | BodySerialNumber | Yüksek |
| 0xA434 | LensModel | Orta |
| 0xA435 | LensSerialNumber | Yüksek |
| 0xFDE8 | OwnerName | Yüksek |
| 0xFDE9 | SerialNumber | Yüksek |
Kimlik belirtmeyen kamera ayarı etiketlerinin tamamını gör
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeGPS etiket listesi
GPS verisi kendi alt IFD'sinde durur ve ana IFD'deki 0x8825 etiketi oraya işaret eder. Bu işaretçi varsa görselinde konum verisi var demektir. Modern akıllı telefonlar bu konuda özellikle hevesli: çoğu zaman tam olarak nerede durduğunu gösterecek kadar hassas bir kayıt bırakıyorlar.
| Etiket ID | Ad | Açıklama |
|---|---|---|
| 0x0000 | GPSVersionID | GPS etiket sürümü |
| 0x0001 | GPSLatitudeRef | N ya da S |
| 0x0002 | GPSLatitude | Derece, dakika, saniye |
| 0x0003 | GPSLongitudeRef | E ya da W |
| 0x0004 | GPSLongitude | Derece, dakika, saniye |
| 0x0005 | GPSAltitudeRef | Deniz seviyesinin üstü veya altı |
| 0x0006 | GPSAltitude | Metre |
| 0x0007 | GPSTimeStamp | UTC saati |
| 0x001D | GPSDateStamp | UTC tarihi |
| 0x0012 | GPSMapDatum | Jeodezik referans verisi |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | Konumun adı |
IPTC etiket listesi
IPTC, haber ajansları fotoğraf altı yazılarını, künyeleri ve telif bilgilerini dosyaya gömebilsin diye tasarlandı. APP13 içinde, "Photoshop 3.0" tanımlayıcısıyla saklanır (evet, standardı Adobe sahiplendi). Lightroom ya da Photoshop'ta bir telif bilgisi veya anahtar kelime eklediysen, o bilgi buraya düşer.
0x0250 By-line (yazar)0x0255 By-line unvanı0x025A Şehir0x025C Alt konum0x025F İl veya eyalet0x0265 Ülke adı0x0274 Telif hakkı bildirimi0x0276 İletişim0x0237 Oluşturulma tarihi0x023C Oluşturulma saati0x0278 Fotoğraf altı yazısı / özet0x0219 Anahtar kelimeler