PicScrub logoPicScrub
Quay lại danh sách định dạng

JPEG

lộ nhiều nhất

Một file JPEG cất siêu dữ liệu trong các segment APPn, nằm giữa phần đầu file và dữ liệu ảnh. Đây là thứ nằm ở đâu, và PicScrub làm gì với từng phần.

hồ sơ màu, muốn giữ thì giữ
SOIđầu file
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMchú thích
SOS …tấm ảnh thật của bạn, còn nguyên
EOIcuối file
GPS với máy ảnh trốn ở đây, xóa hết
giống hệt đến từng byte

Những gì bị xóa

  • EXIF tọa độ GPS, hãng và model máy ảnh, ngày giờ chụp, thông số phơi sáng
  • XMP lịch sử chỉnh sửa, phần mềm đã dùng, điểm đánh giá
  • IPTC / Photoshop chú thích, thông tin ghi công, từ khóa
  • Chú thích và ảnh thu nhỏ nhúng sẵn một bản sao tí hon của ảnh gốc, có thể sống sót qua cả những lần bạn cắt cúp và chỉnh sửa

Những gì bạn có thể giữ

  • Dữ liệu ảnh luôn nguyên vẹn, không bao giờ bị mã hóa lại
  • Hồ sơ màu ICC tùy chọn, để màu sắc không bị lệch
  • Hướng ảnh tùy chọn, để ảnh dọc không bị nằm ngang
  • Thông báo bản quyền tùy chọn, cho ai muốn được ghi công mà không lộ tọa độ

Nhìn tổng quan cấu trúc file

Nếu từng mở một file JPEG bằng trình soạn thảo hex, bạn sẽ thấy nó gồm nhiều segment ngăn cách bởi các marker. Mọi marker đều bắt đầu bằng 0xFF, theo sau là một byte cho biết đó là loại segment nào. Thiết kế này khiến JPEG khá dễ đọc: chỉ cần dò tìm các byte FF rồi xem ngay sau nó là gì.

Điều đáng nói về quyền riêng tư là toàn bộ siêu dữ liệu (EXIF, GPS, ngày giờ chụp) đều nằm trong các segment đó, hoàn toàn tách khỏi dữ liệu ảnh thật. Nhờ vậy chúng tôi xóa được siêu dữ liệu mà không đụng tới pixel và cũng không phải nén lại thứ gì.

Cấu trúc file JPEG

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 byte
Bắt đầu ảnh (FF D8)
APP0-15
100 byte
Marker ứng dụng (siêu dữ liệu)
DQT
130 byte
Bảng lượng tử hóa
SOF
20 byte
Bắt đầu khung ảnh
DHT
420 byte
Bảng Huffman
SOS + Data
Độ dài thay đổi
Dữ liệu quét (chính là ảnh)
EOI
2 byte
Kết thúc ảnh (FF D9)

Ví dụ phần đầu file JPEG

SOI (bắt đầu ảnh)
Marker APP0
Độ dài APP0
Định danh JFIF
Dữ liệu JFIF
Marker APP1
Độ dài APP1
Định danh Exif
OffsetHexASCII
0000
FFD8FFE000104A464946000101000048
......JFIF.....H
0010
00480000FFE112344578696600000000
.H.....4Exif..

Cấu trúc của một marker

  • FF xx:Marker (xx cho biết loại)
  • LL LL:Độ dài (2 byte, big-endian, tính cả chính nó)
  • Data...:Dữ liệu của segment (độ dài trừ 2 byte)

Bảng tra đầy đủ các marker JPEG

MarkerTênMô tả
FF D8SOIBắt đầu ảnh
FF D9EOIKết thúc ảnh
FF C0SOF0Bắt đầu khung ảnh (Baseline DCT)
FF C2SOF2Bắt đầu khung ảnh (Progressive DCT)
FF C4DHTKhai báo bảng Huffman
FF DBDQTKhai báo bảng lượng tử hóa
FF DDDRIKhai báo khoảng restart
FF DASOSBắt đầu quét (dữ liệu ảnh nằm ngay sau)
FF FECOMChú thích (siêu dữ liệu)
FF E0APP0Marker JFIF
FF E1APP1Marker EXIF / XMP
FF E2APP2Hồ sơ ICC / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14Chuyển đổi màu của Adobe

Màu vàng = siêu dữ liệu (bị xóa), không tô màu = cấu trúc được giữ nguyên

JFIF và EXIF

Có một chuyện làm khá nhiều người bối rối: file JPEG thường chứa cùng lúc hai chuẩn siêu dữ liệu khác nhau. JFIF ra đời trước và lo những thứ cơ bản như độ phân giải. Sau đó máy ảnh bắt đầu ghi thêm dữ liệu EXIF với đủ thông tin chi tiết về lần chụp. Đa số file JPEG hiện nay có cả hai, nên bạn sẽ thấy cả marker APP0 lẫn APP1 ở gần đầu file.

APP0:JFIF

JPEG File Interchange Format. Thông tin ảnh ở mức cơ bản.

  • • Số phiên bản
  • • Mật độ điểm ảnh (DPI)
  • • Tỉ lệ khung hình
  • • Ảnh thu nhỏ (tùy chọn)

APP1:EXIF

Exchangeable Image File Format. Siêu dữ liệu của máy ảnh.

  • • Hãng và model máy ảnh
  • • Tọa độ GPS
  • • Ngày giờ chụp
  • • Thông số phơi sáng

Mổ xẻ các marker APP

Chuẩn JPEG dành riêng 16 marker "ứng dụng" (APP0 tới APP15) để các hãng muốn dùng sao thì dùng. Qua nhiều năm, mỗi tổ chức lại chiếm lấy một marker cho định dạng siêu dữ liệu của mình. Kết quả là một mớ hơi lộn xộn, nhưng ít ra là mớ lộn xộn có tài liệu đầy đủ.

Chỗ khó là cùng một marker lại có thể mang ý nghĩa khác nhau tùy nội dung. Chẳng hạn APP1 có thể là dữ liệu EXIF hoặc XMP, nên bạn phải nhìn vào chuỗi định danh bên trong mới biết mình đang đụng tới cái nào.

APP0 (0xFFE0):JFIF

Định danh: JFIF\0. Chứa phiên bản, đơn vị mật độ, mật độ X/Y và ảnh thu nhỏ nhúng kèm (tùy chọn). Nhìn chung giữ lại là an toàn.

APP1 (0xFFE1):EXIF

Định danh: Exif\0\0. Chứa nguyên một cấu trúc TIFF với các mục IFD cho thông tin máy ảnh, dữ liệu GPS, ngày giờ chụp, ảnh thu nhỏ và maker note. Đây là mối lo lớn nhất về quyền riêng tư.

APP1 (0xFFE1):XMP

Định danh: http://ns.adobe.com/xap/1.0/\0. Chuẩn siêu dữ liệu dựa trên XML do Adobe đưa ra. Có thể chứa lịch sử chỉnh sửa, thông tin phần mềm và dữ liệu EXIF mở rộng.

Các 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

Định danh: http://ns.adobe.com/xmp/extension/\0. Dành cho dữ liệu XMP vượt quá 65KB, được chia ra nhiều segment APP1.

APP2 (0xFFE2):MPF

Định danh: MPF\0. Multi-Picture Format, dùng cho ảnh nổi và ảnh toàn cảnh.

APP2 (0xFFE2):Hồ sơ ICC

Định danh: ICC_PROFILE\0. Dữ liệu quản lý màu. Có thể bị cắt nhỏ ra nhiều marker APP2. Thường thì giữ lại là an toàn.

APP13 (0xFFED):IPTC/Photoshop

Định danh: Photoshop 3.0\0. Chứa dữ liệu IPTC-IIM với chú thích, từ khóa, bản quyền, thông tin người tạo. Có thể chứa thông tin tác giả.

APP14 (0xFFEE):Adobe

Định danh: Adobe\0. Chứa các cờ chuyển đổi màu (RGB/CMYK). Quan trọng để màu hiển thị đúng.

Cấu trúc EXIF

Đây là chỗ thú vị (và hơi kỳ lạ). Dữ liệu EXIF thực chất là một file TIFF tí hon nằm gọn bên trong file JPEG của bạn. Đúng vậy đấy. Nó có phần đầu riêng, thứ tự byte riêng, và dùng cấu trúc IFD (Image File Directory) của TIFF để lưu các thẻ.

Thứ đầu tiên bạn thấy ngay sau định danh "Exif" là một header TIFF, cho biết dữ liệu là little-endian (Intel, "II") hay big-endian (Motorola, "MM"). Đọc sai chỗ này thì mọi con số đều thành rác, nên đây luôn là thứ đầu tiên mà mọi bộ đọc kiểm tra.

Header TIFF (8 byte)

Thứ tự byte (II = little-endian)
Số nhận dạng (42)
Offset của IFD0
OffsetHexASCII
0000
49492A0008000000
II*.....

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

Cấu trúc một mục IFD (12 byte)

ID thẻKiểuSố lượngGiá trị/Offset
2 byte2 byte4 byte4 byte

Những mục IFD đáng chú ý

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

PicScrub xử lý JPEG như thế nào

Cách làm khá đơn giản: chúng tôi đọc lần lượt từng marker trong file, giữ lại những marker cần thiết để hiển thị ảnh, và bỏ qua những marker chứa siêu dữ liệu. Vì không bao giờ đụng vào phần dữ liệu ảnh đã nén, chất lượng không suy giảm chút nào.

Mấu chốt là cấu trúc dựa trên marker của JPEG khiến việc này rất dễ. Chúng tôi không cần hiểu hệ số DCT hay bảng Huffman. Chỉ cần biết segment nào là siêu dữ liệu và segment nào thì không.

1

Kiểm tra phần đầu file

Xác nhận có marker SOI (FF D8) ở đầu file

2

Đọc các marker

Đọc lần lượt từng marker, lấy ra loại và độ dài

3

Nhận diện siêu dữ liệu

Kiểm tra định danh trong các segment APP (EXIF, XMP, IPTC, v.v.)

4

Chép có chọn lọc

Chép các segment không phải siêu dữ liệu sang file mới, bỏ qua phần còn lại

Những gì được giữ lại

  • • Marker SOI/EOI (bắt buộc)
  • • DQT (bảng lượng tử hóa)
  • • SOF (phần đầu khung ảnh)
  • • DHT (bảng Huffman)
  • • SOS và dữ liệu quét (chính là ảnh)
  • • Tùy chọn: hồ sơ màu ICC (có thể bật tắt)

Những gì bị xóa

  • • APP1 EXIF (máy ảnh, GPS, ngày giờ chụp)
  • • APP1 XMP (siêu dữ liệu chỉnh sửa)
  • • APP13 IPTC (chú thích, tác giả)
  • • Marker COM (chú thích)
  • • Ảnh thu nhỏ trong EXIF

Bảng tra thẻ EXIF

Xét về quyền riêng tư, không phải thẻ EXIF nào cũng như nhau. Một số thẻ, chẳng hạn thông số phơi sáng, khá vô hại. Số khác, như số sê-ri hay tên chủ sở hữu, có thể chỉ đích danh bạn hoặc thiết bị của bạn. Đây là những thẻ mà chúng tôi xếp vào loại rủi ro cao:

ID thẻTênRủi ro riêng tư
0x9003DateTimeOriginalCao
0x9004DateTimeDigitizedCao
0x9010OffsetTimeTrung bình
0x9286UserCommentCao
0x927CMakerNoteCao
0xA420ImageUniqueIDCao
0xA430CameraOwnerNameCao
0xA431BodySerialNumberCao
0xA434LensModelTrung bình
0xA435LensSerialNumberCao
0xFDE8OwnerNameCao
0xFDE9SerialNumberCao
Xem tất cả các thẻ thông số máy ảnh (không nhận dạng được bạn)
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

Bảng tra thẻ GPS

Dữ liệu GPS nằm trong một sub-IFD riêng, được thẻ 0x8825 trong IFD chính trỏ tới. Nếu con trỏ đó tồn tại thì ảnh của bạn có dữ liệu vị trí. Điện thoại thông minh đời mới đặc biệt hăng hái trong việc nhúng thứ này, thường là đủ chính xác để chỉ ra bạn đứng đúng ở chỗ nào.

ID thẻTênMô tả
0x0000GPSVersionIDPhiên bản thẻ GPS
0x0001GPSLatitudeRefBắc hay Nam
0x0002GPSLatitudeĐộ, phút, giây
0x0003GPSLongitudeRefĐông hay Tây
0x0004GPSLongitudeĐộ, phút, giây
0x0005GPSAltitudeRefTrên hay dưới mực nước biển
0x0006GPSAltitudeTính bằng mét
0x0007GPSTimeStampGiờ UTC
0x001DGPSDateStampNgày UTC
0x0012GPSMapDatumHệ quy chiếu trắc địa
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationTên địa điểm

Bảng tra thẻ IPTC

IPTC vốn được thiết kế cho các hãng tin, để nhúng chú thích, thông tin ghi công và bản quyền vào ảnh. Nó nằm trong APP13 với định danh "Photoshop 3.0" (đúng vậy, Adobe đã tiếp nhận chuẩn này). Nếu bạn từng thêm thông tin bản quyền hay từ khóa trong Lightroom hoặc Photoshop, đây chính là nơi chúng nằm lại.

0x0250 By-line (tác giả)
0x0255 By-line Title
0x025A City
0x025C Sub-location
0x025F Province/State
0x0265 Country Name
0x0274 Copyright Notice
0x0276 Contact
0x0237 Date Created
0x023C Time Created
0x0278 Caption/Abstract
0x0219 Keywords