JPEG
yang paling bocorFile JPEG menyimpan metadatanya di segmen APPn, di antara header file dan data gambarnya. Ini isi tiap bagiannya, dan apa yang dilakukan PicScrub pada masing-masing.
Yang dihapus
- EXIF koordinat GPS, merek dan model kamera, cap waktu, pengaturan eksposur
- XMP riwayat penyuntingan, software yang dipakai, penilaian
- IPTC / Photoshop keterangan foto, kredit, kata kunci
- Komentar dan thumbnail tertanam salinan mungil dari foto aslinya yang bisa selamat dari crop dan editan kamu
Yang bisa kamu pertahankan
- Data gambar selalu utuh, tidak pernah dikodekan ulang
- Profil warna ICC opsional, supaya warnanya tetap akurat
- Orientasi opsional, supaya foto potret tidak jadi miring
- Pemberitahuan hak cipta opsional, buat fotografer yang mau namanya tetap ada tanpa koordinat
Gambaran umum struktur file
Kalau kamu pernah membuka JPEG di editor hex, kamu pasti melihat bahwa isinya berupa segmen-segmen yang dipisahkan oleh marker. Semua marker diawali 0xFF, lalu satu byte yang menandakan jenis segmennya. Rancangan ini membuat JPEG relatif gampang dibaca: cukup cari byte FF lalu periksa apa yang mengikutinya.
Bagian yang menarik dari sisi privasi: semua metadatanya (EXIF, GPS, cap waktu) tinggal di segmen-segmen itu, terpisah sepenuhnya dari data gambar yang sebenarnya. Karena itulah kami bisa menghapus metadata tanpa menyentuh pikselnya atau mengompres ulang apa pun.
Struktur file JPEG
Contoh header JPEG
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
Struktur sebuah marker
FF xx:Marker (xx menandakan jenisnya)LL LL:Panjang (2 byte, big-endian, sudah termasuk dirinya sendiri)Data...:Data segmen (panjang - 2 byte)
Daftar lengkap marker JPEG
| Marker | Nama | Keterangan |
|---|---|---|
| FF D8 | SOI | Awal gambar |
| FF D9 | EOI | Akhir gambar |
| FF C0 | SOF0 | Awal frame (DCT baseline) |
| FF C2 | SOF2 | Awal frame (DCT progresif) |
| FF C4 | DHT | Definisi tabel Huffman |
| FF DB | DQT | Definisi tabel kuantisasi |
| FF DD | DRI | Definisi interval restart |
| FF DA | SOS | Awal scan (data gambarnya menyusul) |
| FF FE | COM | Komentar (metadata) |
| FF E0 | APP0 | Marker JFIF |
| FF E1 | APP1 | Marker EXIF / XMP |
| FF E2 | APP2 | Profil ICC / MPF |
| FF ED | APP13 | IPTC / Photoshop |
| FF EE | APP14 | Transformasi warna Adobe |
Emas = metadata (dihapus), polos = struktur yang tetap ada
JFIF versus EXIF
Ada satu hal yang sering bikin orang bingung: file JPEG sering memuat dua standar metadata sekaligus. JFIF datang lebih dulu dan mengurusi hal-hal dasar seperti resolusi. Lalu kamera mulai menambahkan data EXIF berisi informasi pemotretan yang jauh lebih rinci. Kebanyakan JPEG modern membawa keduanya, dan karena itulah kamu melihat marker APP0 dan APP1 berdekatan di awal file.
APP0:JFIF
JPEG File Interchange Format. Informasi dasar gambar.
- • Nomor versi
- • Kerapatan piksel (DPI)
- • Rasio aspek
- • Thumbnail opsional
APP1:EXIF
Exchangeable Image File Format. Metadata kamera.
- • Merek dan model kamera
- • Koordinat GPS
- • Cap waktu
- • Pengaturan eksposur
Marker APP secara rinci
Spesifikasi JPEG menyediakan 16 marker "aplikasi" (APP0 sampai APP15) supaya tiap vendor bisa memakainya sesuka mereka. Selama bertahun-tahun, organisasi yang berbeda mengklaim marker yang berbeda untuk format metadatanya masing-masing. Hasilnya agak berantakan, tapi setidaknya berantakannya terdokumentasi rapi.
Bagian yang tricky, marker yang sama bisa berarti hal yang berbeda tergantung isinya. APP1, misalnya, bisa berisi data EXIF atau XMP, jadi kamu harus melihat string identifier di dalamnya untuk tahu kamu sedang berurusan dengan yang mana.
APP0 (0xFFE0):JFIF
Identifier: JFIF\0. Berisi versi, satuan kerapatan, kerapatan X/Y, dan thumbnail tertanam yang sifatnya opsional. Umumnya aman dipertahankan.
APP1 (0xFFE1):EXIF
Identifier: Exif\0\0. Berisi struktur TIFF lengkap dengan entri IFD untuk info kamera, data GPS, cap waktu, thumbnail, dan maker note. Masalah privasi yang utama.
APP1 (0xFFE1):XMP
Identifier: http://ns.adobe.com/xap/1.0/\0. Standar metadata berbasis XML buatan Adobe. Bisa berisi riwayat penyuntingan, info software, dan data EXIF yang diperluas.
Namespace XMP
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):Extended XMP
Identifier: http://ns.adobe.com/xmp/extension/\0. Untuk data XMP yang melebihi 65 KB, dipecah ke beberapa segmen APP1.
APP2 (0xFFE2):MPF
Identifier: MPF\0. Multi-Picture Format, untuk gambar stereoskopis dan panorama.
APP2 (0xFFE2):Profil ICC
Identifier: ICC_PROFILE\0. Data manajemen warna. Bisa dipecah ke beberapa marker APP2. Biasanya aman dipertahankan.
APP13 (0xFFED):IPTC/Photoshop
Identifier: Photoshop 3.0\0. Berisi data IPTC-IIM dengan keterangan foto, kata kunci, hak cipta, dan info pembuat. Bisa memuat identitas penulisnya.
APP14 (0xFFEE):Adobe
Identifier: Adobe\0. Berisi penanda transformasi warna (RGB/CMYK). Penting supaya warnanya tampil dengan benar.
Struktur EXIF
Di sinilah ceritanya jadi menarik (dan sedikit aneh). Data EXIF sebenarnya adalah file TIFF mungil yang tertanam di dalam JPEG kamu. Ya, serius. Dia punya header sendiri, urutan byte sendiri, dan memakai struktur IFD (Image File Directory) milik TIFF untuk menyimpan tag.
Hal pertama yang kamu lihat setelah identifier "Exif" adalah header TIFF yang memberi tahu apakah datanya little-endian (Intel, "II") atau big-endian (Motorola, "MM"). Salah membacanya berarti semua angkanya jadi kacau, jadi itu hal pertama yang dicek parser mana pun.
Header TIFF (8 byte)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (little-endian), MM = Motorola (big-endian)
Struktur satu entri IFD (12 byte)
Entri IFD yang penting
0x010F:Make0x0110:Model0x0132:DateTime0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0x927C:MakerNoteBagaimana PicScrub memproses JPEG
Pendekatannya cukup lugas: kami menyusuri file marker demi marker, menyimpan yang memang dibutuhkan untuk menampilkan gambar, dan melewati yang berisi metadata. Karena kami tidak pernah menyentuh data gambar yang terkompresi, tidak ada kualitas yang berkurang.
Kuncinya, struktur JPEG yang berbasis marker membuat semua ini mudah. Kami tidak perlu memahami koefisien DCT atau tabel Huffman. Kami hanya perlu tahu segmen mana yang metadata dan mana yang bukan.
Memvalidasi header
Memastikan ada marker SOI (FF D8) di awal file
Membaca marker
Membaca tiap marker secara berurutan sambil mengambil jenis dan panjangnya
Mengenali metadata
Memeriksa identifier di dalam segmen APP (EXIF, XMP, IPTC, dan lainnya)
Menyalin secara selektif
Menyalin segmen yang bukan metadata ke hasilnya, dan melewati yang metadata
Yang dipertahankan
- • Marker SOI/EOI (wajib)
- • DQT (tabel kuantisasi)
- • SOF (header frame)
- • DHT (tabel Huffman)
- • SOS dan data scan (gambarnya sendiri)
- • Opsional: profil warna ICC (bisa diatur)
Yang dihapus
- • APP1 EXIF (kamera, GPS, cap waktu)
- • APP1 XMP (metadata penyuntingan)
- • APP13 IPTC (keterangan foto, pembuat)
- • Marker COM (komentar)
- • Thumbnail EXIF
Daftar tag EXIF
Soal privasi, tidak semua tag EXIF sama bahayanya. Sebagian, seperti pengaturan eksposur, cukup tidak berbahaya. Sebagian lain, seperti nomor seri dan nama pemilik, bisa mengenali kamu atau peralatan kamu secara unik. Ini yang kami anggap berisiko tinggi:
| ID tag | Nama | Risiko privasi |
|---|---|---|
| 0x9003 | DateTimeOriginal | Tinggi |
| 0x9004 | DateTimeDigitized | Tinggi |
| 0x9010 | OffsetTime | Sedang |
| 0x9286 | UserComment | Tinggi |
| 0x927C | MakerNote | Tinggi |
| 0xA420 | ImageUniqueID | Tinggi |
| 0xA430 | CameraOwnerName | Tinggi |
| 0xA431 | BodySerialNumber | Tinggi |
| 0xA434 | LensModel | Sedang |
| 0xA435 | LensSerialNumber | Tinggi |
| 0xFDE8 | OwnerName | Tinggi |
| 0xFDE9 | SerialNumber | Tinggi |
Lihat semua tag pengaturan kamera (tidak mengidentifikasi)
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeDaftar tag GPS
Data GPS tinggal di sub-IFD-nya sendiri, yang ditunjuk oleh tag 0x8825 di IFD utama. Kalau pointer itu ada, berarti ada data lokasi di dalam gambar kamu. Ponsel masa kini sangat rajin menanamkan data ini, sering kali dengan ketelitian yang cukup untuk menunjuk persis di titik mana kamu berdiri.
| ID tag | Nama | Keterangan |
|---|---|---|
| 0x0000 | GPSVersionID | Versi tag GPS |
| 0x0001 | GPSLatitudeRef | N atau S |
| 0x0002 | GPSLatitude | Derajat, menit, detik |
| 0x0003 | GPSLongitudeRef | E atau W |
| 0x0004 | GPSLongitude | Derajat, menit, detik |
| 0x0005 | GPSAltitudeRef | Di atas atau di bawah permukaan laut |
| 0x0006 | GPSAltitude | Meter |
| 0x0007 | GPSTimeStamp | Waktu UTC |
| 0x001D | GPSDateStamp | Tanggal UTC |
| 0x0012 | GPSMapDatum | Datum geodetik yang dipakai |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | Nama lokasinya |
Daftar tag IPTC
IPTC dirancang supaya kantor berita bisa menanamkan keterangan foto, kredit, dan info hak cipta. Datanya disimpan di dalam APP13 dengan identifier "Photoshop 3.0" (ya, Adobe ikut mengadopsinya). Kalau kamu pernah menambahkan info hak cipta atau kata kunci di Lightroom atau Photoshop, di situlah semuanya berakhir.
0x0250 By-line (pembuat)0x0255 By-line Title (jabatan pembuat)0x025A City (kota)0x025C Sub-location (lokasi spesifik)0x025F Province/State (provinsi)0x0265 Country Name (negara)0x0274 Copyright Notice (pemberitahuan hak cipta)0x0276 Contact (kontak)0x0237 Date Created (tanggal dibuat)0x023C Time Created (waktu dibuat)0x0278 Caption/Abstract (keterangan foto)0x0219 Keywords (kata kunci)