PicScrub logoPicScrub
형식 목록으로 돌아가기

GIF 형식

Graphics Interchange Format

블록 구조

GIF는 예상 수명을 수십 년이나 넘겨 살아남은 형식이에요. 1987년에 CompuServe가 만들었는데, 애니메이션을 지원한다는 이유로 지금도 어디에서나 볼 수 있습니다.

구조는 블록 기반이라 요즘 형식들에 비하면 시원할 만큼 단순해요. 헤더, 몇 가지 디스크립터, 컬러 테이블, 이미지 데이터, 그리고 "끝"을 알리는 1바이트짜리 트레일러가 전부입니다.

GIF 파일 구조

Header
LSD
GCT
Extensions
Image Data
Trailer
Header
6바이트
GIF87a 또는 GIF89a
LSD
7바이트
Logical Screen Descriptor
GCT
768바이트
전역 컬러 테이블 (선택 사항)
Extensions
100바이트
확장 블록 (메타데이터)
Image Data
가변 길이
이미지 디스크립터 + LZW 데이터
Trailer
1바이트
0x3B 종료 바이트

GIF 헤더

GIF 시그니처
버전 (89a)
너비 (640)
높이 (480)
패킹된 필드
배경색 인덱스
픽셀 종횡비
OffsetHexASCII
0000
4749463839618002E001F70000
GIF89a.......

버전 차이

GIF87a

최초 규격. 확장 블록이 없습니다.

GIF89a

확장 블록, 애니메이션, 투명도가 추가되었습니다.

확장 블록

1989년 개정판인 GIF89a에서 확장 블록이 생겼고, 그 덕분에 GIF가 애니메이션을 지원하게 되었어요. 모든 확장 블록은 0x21 다음에 종류를 나타내는 바이트가 오는 형태라, 파일을 훑을 때 찾기 쉽습니다. 이 중에는 남겨야 할 것(애니메이션 타이밍)도 있고, 지워야 할 것(주석)도 있어요.

Graphic Control Extension (0xF9)

애니메이션 타이밍, 투명도, 폐기 방식을 제어합니다. 움직이는 GIF에서는 각 이미지 디스크립터 앞에 옵니다. 항상 남깁니다.

21 F9 04 [disposal] [delay] [transparent] 00

Comment Extension (0xFE)

일반 텍스트 주석입니다. 작성자, 생성 날짜, 소프트웨어, 개인적인 메모까지 무엇이든 들어갈 수 있어요. PicScrub이 지웁니다.

21 FE [size] [comment data...] 00

Application Extension (0xFF)

애플리케이션마다 쓰는 데이터입니다. 가장 중요한 건 애니메이션 반복을 담당하는 NETSCAPE2.0이에요. XMP 메타데이터가 들어갈 수도 있습니다.

21 FF 0B [app identifier] [auth code] [data...] 00

Plain Text Extension (0x01)

거의 쓰이지 않습니다. GIF 컬러 테이블로 글자를 그리는 기능인데, 요즘 소프트웨어는 대부분 무시해요.

애플리케이션 확장

NETSCAPE2.0:애니메이션 반복

움직이는 GIF가 몇 번 반복될지 정합니다. 값이 0이면 무한 반복이에요.

확장 블록 시작
블록 크기 (11)
NETSCAPE2.0
서브 블록 크기
서브 블록 ID
반복 횟수
종료 바이트
OffsetHexASCII
0000
21FF0B4E45545343415045322E300301000000
!..NETSCAPE2.0.....

PicScrub은 애니메이션이 그대로 돌아가도록 NETSCAPE2.0을 남깁니다.

XMP Data:Extensible Metadata Platform

애플리케이션 식별자: XMP DataXMP. XML 형식의 XMP/RDF 메타데이터가 통째로 들어 있습니다.

PicScrub은 XMP 애플리케이션 확장을 지웁니다.

애니메이션 지키기

GIF에서 까다로운 점은 남겨야 할 애니메이션 데이터와 지워야 할 메타데이터를 구분하는 일이에요. 둘 다 확장 블록에 들어 있어서 확장 블록을 전부 지워 버릴 수는 없습니다.

애니메이션을 위해 남기는 것

  • • NETSCAPE2.0 반복 횟수
  • • Graphic Control Extension
  • • 프레임 지연 시간
  • • 폐기 방식
  • • 투명도 인덱스
  • • 지역 컬러 테이블

지우는 것

  • • 주석 확장 블록
  • • XMP 애플리케이션 블록
  • • 알 수 없는 애플리케이션 블록
  • • Plain Text 확장 블록

PicScrub이 GIF를 처리하는 방법

1

헤더 확인

GIF87a 또는 GIF89a 시그니처인지 검사합니다

2

헤더 데이터 복사

LSD와 전역 컬러 테이블을 그대로 옮깁니다

3

확장 블록 걸러내기

NETSCAPE2.0과 Graphic Control은 남기고, 주석과 XMP는 지웁니다

4

이미지 데이터 유지

모든 이미지 디스크립터, 지역 컬러 테이블, LZW 데이터를 그대로 복사합니다

5

트레일러 쓰기

0x3B 트레일러 바이트로 파일을 끝냅니다

LZW 압축

GIF의 이미지 데이터에 관해 한마디 덧붙이자면, LZW 압축을 씁니다. 2004년까지 특허가 걸려 있어서 90년대에 온갖 소동을 일으켰던 그 방식이죠. PicScrub은 압축된 데이터를 전혀 건드리지 않아요. 바이트 단위로 그대로 복사하니 화질 손실이 0입니다.

왜 중요할까요

원래의 LZW 데이터를 그대로 두기 때문에 PicScrub은 이런 걸 보장합니다:

  • • 화질 손실 없음 (비트 단위로 완전히 동일)
  • • 빠른 처리 (디코딩/인코딩 과정이 없음)
  • • 이미지 데이터 크기가 그대로 유지됨

GIF 메타데이터의 한계

GIF의 좋은 점은 EXIF 표준보다 먼저 나왔다는 거예요. 그래서 GPS 좌표나 카메라 정보를 걱정할 일이 없습니다. 메타데이터 문제는 훨씬 소박한 편이에요.

새어 나갈 수 있는 것

GIF의 프라이버시 문제는 JPEG에 비하면 비교적 사소합니다:

  • • 주석 확장 블록 (작성자 메모가 들어 있을 때가 있어요)
  • • XMP 메타데이터 (드물지만 가능합니다)
  • • 애플리케이션 블록에 남는 소프트웨어 정보