PicScrub logoPicScrub
Formatlara dön

JPEG

en çok sızdıran

Bir 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ığı.

renk profili, istersen kalıyor
SOIbaşlangıç
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMyorum
SOS …asıl fotoğrafın, hiç dokunulmadan
EOIson
GPS ve kamera burada saklanıyor, silindi
bayt bayt aynısı

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ı

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 bayt
Görsel başlangıcı (FF D8)
APP0-15
100 bayt
Uygulama işaretleyicileri (meta veri)
DQT
130 bayt
Nicemleme tabloları
SOF
20 bayt
Kare başlangıcı
DHT
420 bayt
Huffman tabloları
SOS + Data
Değişken uzunluk
Tarama verisi (görselin kendisi)
EOI
2 bayt
Görsel sonu (FF D9)

JPEG başlığı örneği

SOI (görsel başlangıcı)
APP0 işaretleyicisi
APP0 uzunluğu
JFIF tanımlayıcısı
JFIF verisi
APP1 işaretleyicisi
APP1 uzunluğu
Exif tanımlayıcısı
OffsetHexASCII
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

İşaretleyiciAdAçıklama
FF D8SOIGörsel başlangıcı
FF D9EOIGörsel sonu
FF C0SOF0Kare başlangıcı (baseline DCT)
FF C2SOF2Kare başlangıcı (progressive DCT)
FF C4DHTHuffman tablosu tanımı
FF DBDQTNicemleme tablosu tanımı
FF DDDRIYeniden başlatma aralığı tanımı
FF DASOSTarama başlangıcı (görsel verisi buradan sonra gelir)
FF FECOMYorum (meta veri)
FF E0APP0JFIF işaretleyicisi
FF E1APP1EXIF / XMP işaretleyicisi
FF E2APP2ICC profili / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14Adobe 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)

Bayt sırası (II = little-endian)
Sihirli sayı (42)
IFD0 offset
OffsetHexASCII
0000
49492A0008000000
II*.....

II = Intel (little-endian), MM = Motorola (big-endian)

IFD girdisinin yapısı (12 bayt)

Etiket IDTürAdetDeğer/offset
2 bayt2 bayt4 bayt4 bayt

Öne çıkan IFD girdileri

0x010F:Make
0x0110:Model
0x0132:DateTime
0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0x927C:MakerNote

PicScrub 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.

1

Başlığı doğrula

Dosyanın başındaki SOI işaretleyicisini (FF D8) kontrol et

2

İşaretleyicileri çözümle

Her işaretleyiciyi sırayla oku, türünü ve uzunluğunu çıkar

3

Meta verileri tespit et

APP segmentlerindeki tanımlayıcıları kontrol et (EXIF, XMP, IPTC vb.)

4

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 IDAdGizlilik riski
0x9003DateTimeOriginalYüksek
0x9004DateTimeDigitizedYüksek
0x9010OffsetTimeOrta
0x9286UserCommentYüksek
0x927CMakerNoteYüksek
0xA420ImageUniqueIDYüksek
0xA430CameraOwnerNameYüksek
0xA431BodySerialNumberYüksek
0xA434LensModelOrta
0xA435LensSerialNumberYüksek
0xFDE8OwnerNameYüksek
0xFDE9SerialNumberYüksek
Kimlik belirtmeyen kamera ayarı etiketlerinin tamamını gör
0x829A ExposureTime
0x829D FNumber
0x8822 ExposureProgram
0x8827 ISOSpeedRatings
0x9201 ShutterSpeedValue
0x9202 ApertureValue
0x9203 BrightnessValue
0x9204 ExposureBiasValue
0x9207 MeteringMode
0x9208 LightSource
0x9209 Flash
0x920A FocalLength
0xA001 ColorSpace
0xA002 PixelXDimension
0xA003 PixelYDimension
0xA402 ExposureMode
0xA403 WhiteBalance
0xA405 FocalLengthIn35mmFilm
0xA406 SceneCaptureType

GPS 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 IDAdAçıklama
0x0000GPSVersionIDGPS etiket sürümü
0x0001GPSLatitudeRefN ya da S
0x0002GPSLatitudeDerece, dakika, saniye
0x0003GPSLongitudeRefE ya da W
0x0004GPSLongitudeDerece, dakika, saniye
0x0005GPSAltitudeRefDeniz seviyesinin üstü veya altı
0x0006GPSAltitudeMetre
0x0007GPSTimeStampUTC saati
0x001DGPSDateStampUTC tarihi
0x0012GPSMapDatumJeodezik referans verisi
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationKonumun 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 Şehir
0x025C Alt konum
0x025F İl veya eyalet
0x0265 Ülke adı
0x0274 Telif hakkı bildirimi
0x0276 İletişim
0x0237 Oluşturulma tarihi
0x023C Oluşturulma saati
0x0278 Fotoğraf altı yazısı / özet
0x0219 Anahtar kelimeler