PicScrub logoPicScrub
กลับไปหน้ารูปแบบไฟล์

JPEG

ตัวที่หลุดเยอะสุด

ไฟล์ JPEG เก็บเมทาดาต้าไว้ในเซกเมนต์ APPn ระหว่างส่วนหัวของไฟล์กับข้อมูลภาพ นี่คือสิ่งที่อยู่ในแต่ละส่วน และสิ่งที่ PicScrub ทำกับมัน

โปรไฟล์สี เก็บไว้ได้ถ้าอยาก
SOIเริ่ม
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMคอมเมนต์
SOS …รูปจริงของคุณ ไม่ถูกแตะเลย
EOIจบ
GPS กับข้อมูลกล้องซ่อนตรงนี้ ลบทิ้ง
เหมือนเดิมทุกไบต์

อะไรบ้างที่ถูกลบ

  • EXIF พิกัด GPS, ยี่ห้อและรุ่นกล้อง, วันเวลา, ค่าการเปิดรับแสง
  • XMP ประวัติการแก้ไข, ซอฟต์แวร์ที่ใช้, การให้ดาว
  • IPTC / Photoshop คำบรรยาย, เครดิต, คำสำคัญ
  • คอมเมนต์และภาพขนาดย่อที่ฝังอยู่ สำเนาจิ๋วของภาพต้นฉบับที่อาจรอดจากการครอปและการแต่งรูปของคุณมาได้

อะไรบ้างที่เก็บไว้ได้

  • ข้อมูลภาพ ไม่ถูกแตะเลย ไม่มีการเข้ารหัสใหม่
  • โปรไฟล์สี ICC เลือกได้ เพื่อให้สียังตรงเหมือนเดิม
  • การหมุนภาพ เลือกได้ เพื่อให้ภาพแนวตั้งไม่ล้ม
  • ประกาศลิขสิทธิ์ เลือกได้ สำหรับช่างภาพที่อยากได้เครดิตโดยไม่ต้องแถมพิกัด

ภาพรวมโครงสร้างไฟล์

ถ้าคุณเคยเปิดไฟล์ JPEG ด้วย hex editor คุณจะเห็นว่ามันประกอบขึ้นจาก เซกเมนต์ที่คั่นด้วยมาร์กเกอร์ มาร์กเกอร์ทุกตัวขึ้นต้นด้วย 0xFF ตามด้วยไบต์ที่บอกว่าเซกเมนต์นั้นเป็นชนิดไหน การออกแบบแบบนี้ทำให้อ่าน JPEG ได้ค่อนข้างง่าย แค่ไล่หาไบต์ FF แล้วดูว่าตามหลังมาด้วยอะไร

ส่วนที่น่าสนใจในแง่ความเป็นส่วนตัวคือ เมทาดาต้าทั้งหมด (EXIF, GPS, วันเวลา) อยู่ในเซกเมนต์พวกนี้ แยกออกจากข้อมูลภาพจริงโดยสิ้นเชิง เราจึงลบเมทาดาต้าได้โดยไม่ต้องแตะพิกเซลหรือบีบอัดอะไรใหม่เลย

โครงสร้างไฟล์ JPEG

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 ไบต์
จุดเริ่มต้นของภาพ (FF D8)
APP0-15
100 ไบต์
มาร์กเกอร์ของแอปพลิเคชัน (เมทาดาต้า)
DQT
130 ไบต์
ตารางควอนไทซ์
SOF
20 ไบต์
จุดเริ่มต้นของเฟรม
DHT
420 ไบต์
ตาราง Huffman
SOS + Data
ความยาวไม่คงที่
ข้อมูลสแกน (ตัวภาพ)
EOI
2 ไบต์
จุดสิ้นสุดของภาพ (FF D9)

ตัวอย่างส่วนหัวของไฟล์ JPEG

SOI (จุดเริ่มต้นของภาพ)
มาร์กเกอร์ APP0
ความยาวของ APP0
ตัวระบุ JFIF
ข้อมูล JFIF
มาร์กเกอร์ APP1
ความยาวของ APP1
ตัวระบุ Exif
OffsetHexASCII
0000
FFD8FFE000104A464946000101000048
......JFIF.....H
0010
00480000FFE112344578696600000000
.H.....4Exif..

โครงสร้างของมาร์กเกอร์

  • FF xx:มาร์กเกอร์ (xx บอกชนิด)
  • LL LL:ความยาว (2 ไบต์ แบบ big-endian นับรวมตัวเองด้วย)
  • Data...:ข้อมูลของเซกเมนต์ (ความยาว - 2 ไบต์)

รายการมาร์กเกอร์ JPEG ทั้งหมด

มาร์กเกอร์ชื่อคำอธิบาย
FF D8SOIจุดเริ่มต้นของภาพ
FF D9EOIจุดสิ้นสุดของภาพ
FF C0SOF0จุดเริ่มต้นของเฟรม (Baseline DCT)
FF C2SOF2จุดเริ่มต้นของเฟรม (Progressive DCT)
FF C4DHTกำหนดตาราง Huffman
FF DBDQTกำหนดตารางควอนไทซ์
FF DDDRIกำหนดช่วง restart
FF DASOSจุดเริ่มต้นของการสแกน (ข้อมูลภาพตามหลังมา)
FF FECOMคอมเมนต์ (เมทาดาต้า)
FF E0APP0มาร์กเกอร์ JFIF
FF E1APP1มาร์กเกอร์ EXIF / XMP
FF E2APP2โปรไฟล์ ICC / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14การแปลงสีของ Adobe

สีทอง = เมทาดาต้า (ถูกลบ), สีปกติ = โครงสร้างที่คงไว้

JFIF กับ EXIF ต่างกันอย่างไร

มีเรื่องหนึ่งที่ทำให้หลายคนสับสน คือไฟล์ JPEG มักมีมาตรฐานเมทาดาต้าสองแบบ อยู่พร้อมกัน JFIF มาก่อนและดูแลเรื่องพื้นฐานอย่างความละเอียด ต่อมากล้องเริ่มใส่ข้อมูล EXIF ที่บอกรายละเอียดการถ่ายแบบครบถ้วน JPEG ยุคใหม่ส่วนใหญ่จึงมีทั้งคู่ นั่นคือเหตุผลที่คุณจะเห็นทั้งมาร์กเกอร์ APP0 และ APP1 อยู่ใกล้ๆ ต้นไฟล์

APP0:JFIF

JPEG File Interchange Format ข้อมูลพื้นฐานของภาพ

  • • หมายเลขเวอร์ชัน
  • • ความหนาแน่นของพิกเซล (DPI)
  • • อัตราส่วนภาพ
  • • ภาพขนาดย่อ (ถ้ามี)

APP1:EXIF

Exchangeable Image File Format เมทาดาต้าจากกล้อง

  • • ยี่ห้อและรุ่นกล้อง
  • • พิกัด GPS
  • • วันเวลา
  • • ค่าการเปิดรับแสง

เจาะลึกมาร์กเกอร์ APP

สเปกของ JPEG กันมาร์กเกอร์ "แอปพลิเคชัน" ไว้ 16 ตัว (APP0 ถึง APP15) ให้ผู้ผลิตแต่ละรายเอาไปใช้ได้ตามใจ ผ่านไปหลายปี องค์กรต่างๆ ก็จับจองมาร์กเกอร์คนละตัวไว้เก็บเมทาดาต้าในรูปแบบของตัวเอง ผลลัพธ์เลยค่อนข้างยุ่งเหยิง แต่อย่างน้อยก็เป็นความยุ่งเหยิงที่มีเอกสารกำกับดี

จุดที่ยุ่งยากคือมาร์กเกอร์ตัวเดียวกันอาจหมายถึงคนละอย่างขึ้นอยู่กับเนื้อหาข้างใน อย่าง APP1 เป็นได้ทั้งข้อมูล EXIF และ XMP คุณจึงต้องดูสตริงตัวระบุที่อยู่ข้างในด้วยว่ากำลังเจอกับอะไรอยู่

APP0 (0xFFE0):JFIF

ตัวระบุ: JFIF\0 เก็บเวอร์ชัน หน่วยความหนาแน่น ความหนาแน่นแกน X/Y และภาพขนาดย่อที่ฝังไว้ (ถ้ามี) โดยทั่วไปเก็บไว้ได้อย่างปลอดภัย

APP1 (0xFFE1):EXIF

ตัวระบุ: Exif\0\0 ข้างในเป็นโครงสร้าง TIFF เต็มรูปแบบ พร้อมรายการ IFD ที่เก็บข้อมูลกล้อง ข้อมูล GPS วันเวลา ภาพขนาดย่อ และ maker notes จุดเสี่ยงหลักด้านความเป็นส่วนตัว

APP1 (0xFFE1):XMP

ตัวระบุ: http://ns.adobe.com/xap/1.0/\0 มาตรฐานเมทาดาต้า บนพื้นฐาน XML ของ Adobe เก็บได้ทั้งประวัติการแก้ไข ข้อมูลซอฟต์แวร์ และข้อมูล EXIF เพิ่มเติม

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

ตัวระบุ: http://ns.adobe.com/xmp/extension/\0 สำหรับข้อมูล XMP ที่เกิน 65KB จะถูกแบ่งไปเก็บในหลายเซกเมนต์ APP1

APP2 (0xFFE2):MPF

ตัวระบุ: MPF\0 Multi-Picture Format สำหรับภาพสามมิติและภาพพาโนรามา

APP2 (0xFFE2):โปรไฟล์ ICC

ตัวระบุ: ICC_PROFILE\0 ข้อมูลการจัดการสี แบ่งเก็บข้ามมาร์กเกอร์ APP2 หลายตัวได้ โดยทั่วไปเก็บไว้ได้อย่างปลอดภัย

APP13 (0xFFED):IPTC/Photoshop

ตัวระบุ: Photoshop 3.0\0 เก็บข้อมูล IPTC-IIM ทั้งคำบรรยาย คำสำคัญ ลิขสิทธิ์ และข้อมูลผู้สร้าง อาจมีข้อมูลของผู้เขียนอยู่ด้วย

APP14 (0xFFEE):Adobe

ตัวระบุ: Adobe\0 เก็บแฟล็กการแปลงสี (RGB/CMYK) สำคัญต่อการแสดงสีให้ถูกต้อง

โครงสร้างของ EXIF

ตรงนี้แหละที่เริ่มน่าสนใจ (และแปลกนิดๆ) เพราะจริงๆ แล้วข้อมูล EXIF ก็คือไฟล์ TIFF จิ๋วๆ ที่ฝังอยู่ในไฟล์ JPEG ของคุณ ใช่แล้ว จริงๆ นะ มันมีส่วนหัวของตัวเอง มีลำดับไบต์ของตัวเอง และใช้โครงสร้าง IFD (Image File Directory) ของ TIFF ในการเก็บแท็ก

สิ่งแรกที่คุณจะเห็นถัดจากตัวระบุ "Exif" คือส่วนหัวของ TIFF ที่บอกว่าข้อมูลเป็นแบบ little-endian (Intel, "II") หรือ big-endian (Motorola, "MM") ถ้าอ่านผิดตรงนี้ ตัวเลขทั้งหมดจะเพี้ยนหมด มันจึงเป็นสิ่งแรกที่ตัวอ่านทุกตัวต้องเช็ก

ส่วนหัวของ TIFF (8 ไบต์)

ลำดับไบต์ (II = Little Endian)
Magic Number (42)
offset ของ IFD0
OffsetHexASCII
0000
49492A0008000000
II*.....

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

โครงสร้างของรายการ IFD (12 ไบต์)

Tag IDTypeCountValue/Offset
2 ไบต์2 ไบต์4 ไบต์4 ไบต์

รายการ IFD ที่สำคัญ

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

PicScrub จัดการไฟล์ JPEG อย่างไร

วิธีการค่อนข้างตรงไปตรงมา เราไล่อ่านไฟล์ทีละมาร์กเกอร์ เก็บตัวที่จำเป็นต่อการแสดงภาพไว้ แล้วข้ามตัวที่เป็นเมทาดาต้าไป เพราะเราไม่เคยแตะข้อมูลภาพที่ถูกบีบอัดไว้เลย คุณภาพจึงไม่ลดลงแม้แต่นิดเดียว

กุญแจสำคัญคือโครงสร้างแบบมาร์กเกอร์ของ JPEG ทำให้เรื่องนี้ง่ายมาก เราไม่จำเป็นต้องเข้าใจค่าสัมประสิทธิ์ DCT หรือตาราง Huffman เลย แค่ต้องแยกให้ออกว่าเซกเมนต์ไหนเป็นเมทาดาต้าและเซกเมนต์ไหนไม่ใช่

1

ตรวจสอบส่วนหัว

ยืนยันว่ามีมาร์กเกอร์ SOI (FF D8) อยู่ต้นไฟล์

2

อ่านมาร์กเกอร์

ไล่อ่านมาร์กเกอร์ทีละตัวตามลำดับ ดึงชนิดและความยาวออกมา

3

ระบุว่าอันไหนเป็นเมทาดาต้า

ตรวจตัวระบุในเซกเมนต์ APP (EXIF, XMP, IPTC ฯลฯ)

4

คัดลอกเฉพาะที่ต้องการ

คัดลอกเซกเมนต์ที่ไม่ใช่เมทาดาต้าไปยังไฟล์ผลลัพธ์ แล้วข้ามเซกเมนต์เมทาดาต้า

อะไรบ้างที่เก็บไว้

  • • มาร์กเกอร์ SOI/EOI (จำเป็น)
  • • DQT (ตารางควอนไทซ์)
  • • SOF (ส่วนหัวของเฟรม)
  • • DHT (ตาราง Huffman)
  • • SOS และข้อมูลสแกน (ตัวภาพจริง)
  • • เลือกได้: โปรไฟล์สี ICC (ตั้งค่าได้)

อะไรบ้างที่ถูกลบ

  • • APP1 EXIF (กล้อง, GPS, วันเวลา)
  • • APP1 XMP (เมทาดาต้าการแก้ไข)
  • • APP13 IPTC (คำบรรยาย, ผู้สร้าง)
  • • มาร์กเกอร์ COM (คอมเมนต์)
  • • ภาพขนาดย่อใน EXIF

รายการแท็ก EXIF

แท็ก EXIF ไม่ได้อันตรายเท่ากันหมดในแง่ความเป็นส่วนตัว บางตัวอย่างค่าการเปิดรับแสงก็ค่อนข้างไม่มีพิษภัย แต่บางตัวอย่างหมายเลขเครื่องและชื่อเจ้าของ ระบุตัวคุณหรืออุปกรณ์ของคุณได้เลย นี่คือกลุ่มที่เรามองว่าเสี่ยงสูง

Tag IDชื่อความเสี่ยง
0x9003DateTimeOriginalสูง
0x9004DateTimeDigitizedสูง
0x9010OffsetTimeปานกลาง
0x9286UserCommentสูง
0x927CMakerNoteสูง
0xA420ImageUniqueIDสูง
0xA430CameraOwnerNameสูง
0xA431BodySerialNumberสูง
0xA434LensModelปานกลาง
0xA435LensSerialNumberสูง
0xFDE8OwnerNameสูง
0xFDE9SerialNumberสูง
ดูแท็กการตั้งค่ากล้องทั้งหมด (ไม่ระบุตัวตน)
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

ข้อมูล GPS อยู่ใน sub-IFD ของตัวเอง โดยมีแท็ก 0x8825ใน IFD หลักชี้ไปหา ถ้ามีตัวชี้นี้อยู่ ก็แปลว่ารูปของคุณมีข้อมูลตำแหน่งติดมาด้วย สมาร์ตโฟนยุคใหม่ขยันฝังข้อมูลนี้เป็นพิเศษ และมักละเอียดพอที่จะระบุได้เลยว่าคุณยืนอยู่ตรงไหน

Tag IDชื่อคำอธิบาย
0x0000GPSVersionIDเวอร์ชันของแท็ก GPS
0x0001GPSLatitudeRefN หรือ S
0x0002GPSLatitudeองศา ลิปดา ฟิลิปดา
0x0003GPSLongitudeRefE หรือ W
0x0004GPSLongitudeองศา ลิปดา ฟิลิปดา
0x0005GPSAltitudeRefเหนือหรือใต้ระดับน้ำทะเล
0x0006GPSAltitudeเมตร
0x0007GPSTimeStampเวลา UTC
0x001DGPSDateStampวันที่ UTC
0x0012GPSMapDatumข้อมูลหมุดอ้างอิงทางภูมิศาสตร์
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationชื่อสถานที่

รายการแท็ก IPTC

IPTC ถูกออกแบบมาให้สำนักข่าวฝังคำบรรยาย เครดิต และข้อมูลลิขสิทธิ์ลงในรูป มันถูกเก็บไว้ใน APP13 พร้อมตัวระบุ "Photoshop 3.0" (ใช่แล้ว Adobe รับมาตรฐานนี้มาใช้) ถ้าคุณเคยใส่ข้อมูลลิขสิทธิ์ หรือคำสำคัญใน Lightroom หรือ Photoshop มันก็ไปจบลงตรงนี้แหละ

0x0250 By-line (ผู้สร้าง)
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 (คำสำคัญ)