2011.09.05 17:28

GIF 파일이 무엇인지 알았으니 
이젠 GIF 파일 구조에 대해서 분석해보자


GIF 파일은 어떻게 구성되어 있나요 ?



그림과 같이 파일의 형태는 구성되어 있다.
---------------------------------------------------------------------------------------------
Header                             (파일구조 정보 저장  파일형태와 버전)

Global Screen Descriptor    (이미지 정보 저장 이미지 크기와 색상테이블 크기 등등)

Global Color Table             (색상 테이블로서 색상테이블이 저장)

Image Block                      (실제 데이터에 관한 헤더와 압축되어진 정보를 저장)

Trailer                               (파일의 끝 "B3")

---------------------------------------------------------------------------------------------


 - 시작부분에는 고정된 영역이 존재한다

 - 여러개의 블록들이존재한뒤 이미지를 끝을 나타내는 Trailer 로 되어 있다 일반적으로 "B3"

 - 픽셀당 1에서 8비트를 사용하는 256 컬러를 지원하며 파일내에 여러 이미지를 지원한다.

 - GIF87a 와 GIF89a 의 차이는 87은 유동적인 영역은 단지 이미지 로만 정의되어 있으나
                                           89 에서는 확장 포맷이 있어서 다양한 지원기능이 있다.
 






 


각종 헤더파일에 대한 설명을 하도록 하겠다.
 
 

궁금하다면 GIF 파일 하나를 만들어서 에디터를 통해서 까보는것을 추천한다.
 

이해를 쉽게 하기 위하여 아래의 간단한 GIF 파일 하나를 까서 설명한다.
 








1)  Header File (6 Byte)

    먼저 헤더파일이다. 헤더파일은 GIF 라는 시그니쳐와 Version 정보가 적혀 있다.
    위에서 사용된  녹색으로 표시된 4749 4638 3961 이 헤더 영역이다.
    세부내용은 아래와 같다.

 

(1)   <!--[endif]-->Signature <3 Bytes>

-   “GIF” 라는 파일명이 적혀있음

 

(2)  Version <3 Bytes>

-     Version 정보가 적혀있음

              -       “87a”,  “89a” 두 가지가 있음 (“89a”는 확장영역) 

 





2) Global Screen Descriptor (7 Byte) 
   
   전체적인 이미지의 정보를 나타낸다.
   가로, 세로 크기, 색상테이블 크기, 색상테이블 정렬 여부, 뒷배경 색갈, 픽셀당 비트수 등등
   연두색 밑줄로 쳐진 8000 8000 9102 00 영역이다.




         
(1)   Screen Width <2 Bytes>

-      논리적인 스크린의 크기 With 를 나타냄

-       Unsigned 로 되어 있고 여기서 주의 할 점은 Little-Endian 방식을 사용한다는 것이다.
그래서  80 00 은  256을 나타낸다.

 
 

(2)   Screen Height <2 Bytes>

- 논리적인 스크린의 크기 Height 를 나타냄

-   Unsigned 로 되어 있고 여기서 주의 할 점은 Little-Endian 방식을 사용한다는 것이다.
 
그래서  80 00 은  256을 나타낸다.

 

(3)   Global Color Table Size  <3 Bits> (0000 0xxx)

-   색상 테이블의 수행여부 (중요)

-       3 * ( 2 ^ (n + 1) )

-       여기에서는 n = 1  이기 때문에 3 * (2 ^ (1+1))

-       그래서 3비트를 가지는 4개의 색상테이블 크기사이즈 이기 때문에 12 바이트가 색상테이블로 오게 된다.

 

(4)   Color Table Sort Flag  <1 Bit> (0000 x000)

-       글로벌 색상 테이블의 색들이 중요순서대로 정렬되어 있는지 아닌지 여부

-   0 정렬 안됨, 1 정렬 됨 (자주 사용되는 순서)

 

(5)  Bit per Pixel  <3 Bits > (0xxx 0000)

-      픽셀당 비트수

-      2^n + 1 의 픽셀 (2^1 + 1 = 3)

 

(6)  Global Color Table Flag <1 Bit> (x000 0000)

-      글로벌 색상 테이블의 존재 여부

-       0 테이블 없음, 1 테이블 있음

 

(7)  Background Color <1 Byte>

-    글로벌 내 뒷 배경 색상 테이블의 색인 (Index)

 

(8)   Pixel Aspect Ratio <1 Byte>

-     0이 아닐 경우 폭과 높이가 같지 않음

-   높이대 폭 비율은 (N+15)/64 식으로 사용


※ 리틀 엔디안 방식을 사용하기 때문에 비트를 사용하는 3, 4, 5, 6 비트를 각각 넣을때 주의하라 
   







3) Global Color Table (가변적 크기)

    전역 색상 테이블이다.
    이것의 크기는 위에서 결정했던 Global Color Table Size에 의해 크기가 결정된다.
    위에서 3을 곱했던 이유는 RGB 각각의 값이며 총 4개의 크기를 가졌다.

    연한 보라색으로 칠해진 것이 컬러 테이블이다.
    FF 0000 00FF 00FF FFFF 0000 00     



   
 - RGB 순서로 되어 있다.
 
 - 여기서 색상테이블순서가 중요한 이유는 이 순서의 값이 색상 값이되어 압축에 들어가기 때문이다.
 
 - 쉽게 이해하려면 허프만 코딩방식을 이해하면 된다.

 - 그래서 LZW 알고리즘 허프만 보다 뛰어난 이유를 알 수가 있다. 하지만 색상이 256이라는것!!!
 
  






4) Image Block (가변적 크기)
   
    이미지 정보를 저장하는 곳으로  이 부분은 다음 시간에 3 부분으로 나누어 설명하겠다.
 

       1. 이미지 헤더 부분

       2. 이미지 헤더의 확장영역 (GIF89a 에 포함)

       3. LZW 알고리즘 부분










5) Trailer (1 Byte)

   GIF 끝을 나타내는 것으로 가장 마지막에 있는 3B 가 되겠다.
  
   여기서 앞에 있는 이미지 블럭 안의 3B 는 LZW를 통하여 나온 실제 3B 값이니 혼동하지 말기를
  
  GIF 마지막을 나타내는 부분만 3B 를 사용한다.


  
 

'[Public] 신호처리 > GIF' 카테고리의 다른 글

[GIF] #2 GIF 파일구조에 대해 알아보자  (3) 2011.09.05
[GIF] #1 GIF 파일이란?  (0) 2011.09.05
Posted by 차출발 차출발