JPEG는 가장 사용되는 이미지 압축형식의 하나이지만, JPEG가 사진을 어떻게 압축하고 컴퓨터가 어떻게 JPEG 데이터를 처리하는지는 잘 알려지지 않았습니다. 그런 JPEG 데이터의 구조에 대해 Google의 보안감사에 종사하는 angealbertini 씨가 설명해 줍니다.

formats / jpeg.md at master · corkami / formats · GitHub
https://github.com/corkami/formats/blob/master/image/jpeg.md

corkami/formats

File formats. Contribute to corkami/formats development by creating an account on GitHub.

github.com


JPEG의 정식 명칭은 'Joint Photographic Experts Group'으로 이미지 압축형식의 하나입니다. JPEG파일을 16진수 바이너리로 표시하는 Linux 코멘드 'xxd'에서 JPEG를 보면 이런 느낌. 임의의 문자열이 줄지어있는 것처럼 보이지만, 바이너리의 나열에는 의미가 있습니다.


JPEG는 '데이터 유형' '데이터 길이' '데이터 자체'를 세그먼트라고 정리해서 보관하고 있으며, 그 세그먼트가 늘어선 심플한 구조라는 것. 데이터 유형은 Marker라는 부분에 표시되며, "ff"라는 바이트에 제로가 아닌 바이트를 계속 정의합니다. 예를 들어, 바이너리 상단에 표시되어 있던 'ffd8'는 이미지 데이터의 시작을 의미하고 'SOI'라는 Marker입니다.


반대로 바이너리의 마지막에는 이미지 데이터의 끝을 의미하는 'EOI', Marker인 'ffd9'가 표시되어 있습니다.


JPEG 이미지를 구성하는 바이너리의 전체상은 이런 느낌. 이미지 소프트웨어는 Marker 등을 의지하여 데이터를 로드하고 JPEG 이미지를 표시할 수 있게 되어 있습니다.

Posted by 말총머리
,