PicScrub logoPicScrub
Kembali ke daftar format

JPEG

yang paling bocor

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

profil warna, disimpan kalau kamu mau
SOIawal
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMkomentar
SOS …foto kamu yang asli, tidak disentuh
EOIakhir
GPS dan kamera ngumpet di sini, dihapus
sama persis byte demi byte

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

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 byte
Awal gambar (FF D8)
APP0-15
100 byte
Marker aplikasi (metadata)
DQT
130 byte
Tabel kuantisasi
SOF
20 byte
Awal frame
DHT
420 byte
Tabel Huffman
SOS + Data
Panjang bervariasi
Data scan (gambarnya)
EOI
2 byte
Akhir gambar (FF D9)

Contoh header JPEG

SOI (awal gambar)
Marker APP0
Panjang APP0
Identifier JFIF
Data JFIF
Marker APP1
Panjang APP1
Identifier Exif
OffsetHexASCII
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

MarkerNamaKeterangan
FF D8SOIAwal gambar
FF D9EOIAkhir gambar
FF C0SOF0Awal frame (DCT baseline)
FF C2SOF2Awal frame (DCT progresif)
FF C4DHTDefinisi tabel Huffman
FF DBDQTDefinisi tabel kuantisasi
FF DDDRIDefinisi interval restart
FF DASOSAwal scan (data gambarnya menyusul)
FF FECOMKomentar (metadata)
FF E0APP0Marker JFIF
FF E1APP1Marker EXIF / XMP
FF E2APP2Profil ICC / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14Transformasi 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)

Urutan byte (II = little-endian)
Angka ajaib (42)
Offset IFD0
OffsetHexASCII
0000
49492A0008000000
II*.....

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

Struktur satu entri IFD (12 byte)

ID tagTipeJumlahNilai/offset
2 byte2 byte4 byte4 byte

Entri IFD yang penting

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

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

1

Memvalidasi header

Memastikan ada marker SOI (FF D8) di awal file

2

Membaca marker

Membaca tiap marker secara berurutan sambil mengambil jenis dan panjangnya

3

Mengenali metadata

Memeriksa identifier di dalam segmen APP (EXIF, XMP, IPTC, dan lainnya)

4

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 tagNamaRisiko privasi
0x9003DateTimeOriginalTinggi
0x9004DateTimeDigitizedTinggi
0x9010OffsetTimeSedang
0x9286UserCommentTinggi
0x927CMakerNoteTinggi
0xA420ImageUniqueIDTinggi
0xA430CameraOwnerNameTinggi
0xA431BodySerialNumberTinggi
0xA434LensModelSedang
0xA435LensSerialNumberTinggi
0xFDE8OwnerNameTinggi
0xFDE9SerialNumberTinggi
Lihat semua tag pengaturan kamera (tidak mengidentifikasi)
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

Daftar 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 tagNamaKeterangan
0x0000GPSVersionIDVersi tag GPS
0x0001GPSLatitudeRefN atau S
0x0002GPSLatitudeDerajat, menit, detik
0x0003GPSLongitudeRefE atau W
0x0004GPSLongitudeDerajat, menit, detik
0x0005GPSAltitudeRefDi atas atau di bawah permukaan laut
0x0006GPSAltitudeMeter
0x0007GPSTimeStampWaktu UTC
0x001DGPSDateStampTanggal UTC
0x0012GPSMapDatumDatum geodetik yang dipakai
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationNama 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)