JPEG 세그먼트와 PNG 청크: 메타데이터가 파일에 위치하는 곳
AuditImage의 "파일 구조" 테이블의 각 행을 읽는 방법. APP1, APP11, COM, tEXt, caBX가 무엇을 담고 있는지, 오프셋과 크기가 무엇을 나타내는지.
JPEG: 마커 세그먼트
JPEG는 각각 FF xx로 시작하는 일련의 세그먼트입니다. 이미지 데이터 이전의 모든 것은 메타데이터 또는 디코딩 매개변수입니다:
| 마커 | 이름 | 내용 |
|---|---|---|
| FF D8 | SOI | 이미지 시작 |
| FF E0 | APP0 | JFIF 헤더, 해상도 단위, 썸네일 |
| FF E1 | APP1 | EXIF (Exif\0\0로 시작) 또는 XMP (http://ns.adobe.com/xap/1.0/로 시작) |
| FF E2 | APP2 | ICC 프로필, MPF 다중 이미지 (휴대폰 깊이 사진) |
| FF EB | APP11 | C2PA 매니페스트 (JP로 시작, jumb 박스 보유) |
| FF ED | APP13 | Photoshop IRB, IPTC 포함 |
| FF EE | APP14 | Adobe 색상 변환 플래그 |
| FF FE | COM | 코멘트, 임의 텍스트 |
| FF DB | DQT | 양자화 테이블 |
| FF C4 | DHT | Huffman 테이블 |
| FF C0 | SOF0 | 프레임 헤더: 치수, 구성요소 |
| FF DA | SOS | 스캔 시작, EOI까지 압축 데이터 |
| FF D9 | EOI | 이미지 끝 |
각 세그먼트는 최대 64KB를 보유합니다. 큰 페이로드는 동일한 유형의 여러 세그먼트로 분할됩니다: 큰 XMP는 "확장 XMP"를 사용하며, 큰 C2PA 매니페스트는 여러 APP11 세그먼트로 분할되고 시퀀스 번호로 재조립됩니다. AuditImage 테이블의 두 연속 APP11 C2PA 행이 바로 이것입니다.
PNG: 청크
PNG는 8바이트 시그니처로 시작하고, 각각 길이, 타입, 데이터, CRC를 가진 일련의 청크가 뒤따릅니다:
| 타입 | 내용 |
|---|---|
| IHDR | 치수, 비트 깊이, 색상 타입 |
| iCCP | ICC 프로필 |
| pHYs | 물리적 해상도 |
| eXIf | EXIF (2017년 표준에 추가됨) |
| tEXt / iTXt / zTXt | 키/값 텍스트: XMP, SD 매개변수 및 AIGC 암시적 라벨이 모두 여기에 위치 |
| caBX | C2PA 매니페스트 |
| IDAT | 이미지 데이터, 여러 청크일 수 있음 |
| IEND | 끝 |
PNG의 XMP는 키워드 XML:com.adobe.xmp인 iTXt입니다. Stable Diffusion 매개변수는 키워드 parameters인 tEXt입니다.
WebP: RIFF 청크
WebP는 RIFF 컨테이너입니다: VP8 , VP8L 또는 VP8X가 이미지를 보유하며, EXIF, XMP , ICCP, C2PA가 각각 하나의 청크입니다. 확장 메타데이터에는 VP8X 헤더가 필요합니다.
AuditImage의 "파일 구조" 테이블 읽기
- 세그먼트: 타입 이름. 메타데이터를 담고 있는 세그먼트는 강조 색상으로 굵게 표시됩니다.
- 오프셋: 파일의 바이트 위치, 16진수.
- 크기: 마커와 길이 바이트를 포함한 전체 세그먼트.
- 비율: 전체 파일에 대한 상대적 바.
유용하게 살펴볼 점: 메타데이터 세그먼트는 보통 이미지 데이터 앞에 옵니다; 동일한 유형의 반복된 세그먼트는 주목할 가치가 있습니다; 수십 KB 이미지에 200KB APP11이 있으면 매니페스트가 썸네일을 삽입했음을 의미합니다; 내용이 있는 COM 세그먼트는 펼쳐볼 가치가 있습니다.
수동 확인
exiftool -v3 photo.jpg # 세그먼트별로
exiftool -htmlDump photo.jpg > dump.html