이미지 압축 원리
1. BMP (Windows bitmap)
2. PCX
3. GIF (Graphic Interchanging Format)
4. JPEG
5. WMF (Mircosoft Windows Metafile)
6. 부록 - Graphic File Loader 예제 프로그램


PCX 파일은 ZSoft 사의 PaintBrush 그래픽 편집기를 위한 그래픽 파일 포맷이다. 현재는 그리 많이 쓰이지 않지만 초창기 IBM PC 시절에는 널리 쓰이던 그래픽 포맷이다. 처음엔 16컬러만 지원하다가 팔레트가 추가된 256 컬러까지 확장되었고 지금은 24비트 트루컬러까지 지원하게 되었다.

RLE 압축 :

PCX는 RLE(Run-length encoding)이라는 압축 알고리즘으로 비트맵 데이터를 압축하여 보관하고 있다. RLE 압축 방식은 알고리즘이 간단해 구현이 쉽고 속도가 빠르다는 장점이 있으나 압축 효율이 그리 높지 않고 연속적으로 똑 같은 데이터가 적은 경우에는 특히 압축 효율이 많이 떨어진다는 단점이 있다. PCX 파일에서 사용한 RLE 알고리즘은 다음과 같다.

  1. 현재 읽은 한 바이트의 상위 2비트가 모두 1인 경우(0xC0 보다 크거나 같은 경우) 그 다음 바이트가 실제 저장된 데이터이며 현재 읽은 바이트의 하위 6비트 값은 그 데이터의 반복 횟수를 의미한다.
  2. 현재 읽은 데이터의 상위 2비트가 1이 아닌 경우 현재 읽은 바이트가 실제 저장된 데이터이다.

예를 들어 0xC5 0xF5 0x1A 가 저장되어 있었다고 해보자. 첫번째 바이트가 0xC5로 상위 2비트 모두가 1이므로 첫번째 바이트의 하위 6비트는 다음에 오는 바이트의 반복 횟수를 의미한다. 하위 6비트가 5이므로 다음에 오는 0xF5가 5개 반복되어 있음을 알 수 있다. 세 번째 바이트는 상위 2비트가 1이 아니므로 데이터 자체를 의미한다. 따라서 扁?데이터는 0xF5 0xF5 0xF5 0xF5 0xF5 0x1A 였다. RLE는 반복된 데이터가 많을수록 압축 효율이 높아지지만 반복된 데이터가 전혀 없으면 전혀 압축 효과를 볼 수가 없으며 오히려 원래 데이터보다 더 커질 가능성도 있다. 상위 2비트를 카운터의 유무를 판단하는 용도로 쓰기 때문에 0xC0 부터 0xFF까지 64개의 데이터는 무조건 2바이트를 차지해야 한다. 최악의 경우 데이터가 0xC1, 0xC2, 0xC1, 0xC2, .. 이런 식으로 반복되면 원래 데이터보다 2배 더 커질 수도 있다. 따라서 PCX는 단순한 이미지에 적합한 그래픽 포맷이며 사진과 같이 복잡한 이미지에는 그리 어울리지 않는 포맷이다.

파일 포맷 :

PCX는 한 픽셀을 표시하기 위해 1비트, 4비트 또는 8비트를 사용한다. Color depth를 더 늘이기 위해 Plane을 여러 개 사용할 수 있다. 예를 들어 1비트 Plane을 4개를 사용하면 한 픽셀 당 4비트가 할당되고 4비트 컬러, 즉 16색을 표현할 수 있다. Plane이 여러 개 있을 때는 한 라인의 첫번째 Plane 데이터가 저장된 뒤 그 라인의 두 번째 Plane 데이터가 따라 온다. 이런 식으로 한 라인의 모든 Plane 데이터가 저장되고 그 다음에 다음 라인의 첫번째 Plane 데이터가 오게 된다. (그림 1참고) 이런 식으로 보관된 비트맵 정보를 RLE 방식으로 압축해 놓은 것이 PCX 파일이다.

Color depth와 Plane당 픽셀 크기, Plane 수의 관계는 표 1과 같다.

Color depth 컬러 수 Plane당 한 픽셀의 크기 한 라인 당 Plane 수 한 픽셀 당 비트 수
1비트 컬러 2 (팔레트 사용) 1 1 1
4비트 컬러 16 (팔레트 사용) 4(또는 1) 1(또는 4) 4
8비트 컬러 256 (팔레트 사용) 8 1 8
24비트 컬러 16만 컬러 8 3 24

표 1 Color Depth와 Plane 수

PCX 파일도 BMP 파일과 같이 앞에 헤더를 가지고 있으며 헤더 다음에 RLE 방식으로 압축된 비트맵 정보가 온다. 팔레트가 있는 경우에는 비트맵 다음에 팔레트 정보가 온다. 표 2는 PCX 파일 헤더 포맷이다.

위치 이름 크기 의미
Header
0x00 Manufacturer 1 ZSoft .PCX를 의미. 항상 10이 들어 있다.
0x01 Version 1 0 = Version 2.5
2 = Version 2.8. 팔레트 있음
3 = Version 2.8 팔레트 없음
5 = Version 3.0
0x02 Encoding 1 PCX RLE로 압축되어 있음. 항상 1이 들어있다.
0x03 Bits per pixel 1 한 plane에서 픽셀 당 차지하는 비트 수. 16 컬러의 경우 4, 256 컬러 또는 24비트 컬러의 경우 8의 값을 가진다.
0x04 XMin 2 비트맵의 좌측하단 좌표.
0x06 YMin 2
0x08 XMax 2 비트맵의 상단 우측 좌표.
0x0A YMax 2
0x0C HRes 2 수평 해상도
0x0E VRes 2 수직 해상도
0x10 4bit Colormap 16x3 16 컬러 팔레트
0x40 Reserved 1 사용 안함
0x41 NPlanes 1 Plane 개수. 16컬러일 경우 1, 256 컬러일 경우 1, 24비트 컬러일 경우 3.
0x42 Bytes per Line 2 한 Plane 상에서 한 라인 당 차지하는 바이트 수
0x44 Palette Info 2 1이면 컬러 또는 흑백 팔레트, 2이면 그레이 스케일 팔레트.
0x46 Filler 58 공백. 사용하지 않음.
0x80 RLE로 압축된 비트맵 데이터
-0x301 0x0C 1 팔레트 정보 시작 표시. 항상 0x0C이다.
-0x300 8bit Colormap 256x3 256 컬러 팔레트. 적, 녹, 청색 세기가 순서대로 3바이트씩 저장되어 있다.

표 2 PCX 파일 포맷

Posted by 알 수 없는 사용자
,