이명헌 경영 스쿨
[테크] JPEG과 GIF
잃어버리는 압축과 제한적인 압축
이명헌 [ 1999-9-18 ]

역사

GIF는 아메리카온라인(AOL)이 급성장 이후 몰락의 길을 걷게 된 컴퓨서브(Compuserve)에서 1987년에 만든 포맷입니다. 온라인 상에서 그림 파일 전송을 위해 개발되었습니다. 개발 목적이 온라인 상에서의 이동이었으므로 높은 압축률이 매우 중요한 요구사항이었고, 특히 당시의 느린 모뎀 속도를 생각해 볼 때 가능하면 이미지 사이즈를 작게 만드는것이 매우 중요했습니다. GIF는 개발 당시의 컴퓨터들이 대부분 256컬러까지 지원하고 있었기 때문에 256 컬러만 지원했고 여전히 그렇습니다. 그런 한계에도 불구하고 GIF만의 독특한 장점이 있기 때문에 JPEG과 함께 인터넷 그래픽 파일 포맷의 양대산맥으로 확실히 자리를 굳혀 가고 있습니다.

JPEG은 포맷을 개발한 팀의 이름이 Joint Photographic Experts Group이어서 그 첫 글자를 따서 명명되었습니다. 그룹 이름에 사진 전문가라는 이름이 들어 있다는 데서 알 수 있듯, JPEG은 사진처럼 현실감 있는 그래픽을 작은 사이즈로 압축하기 위해 개발되었습니다. 수천 컬러, 수백만 컬러 이상의 사진을 작은 사이즈로 줄여주는 데 자주 쓰입니다. 어떤 사람들은 JPEG이 그래픽 포맷이라고 할 수 없다고 주장하기도 합니다. JPEG은 개별 포맷이라기보다 TIFF나 JFIF(JPEG Interchange File Format)을 압축하는 데 쓰이는 하나의 방식이기 때문입니다.

압축 원리

GIF 압축방식의 원리인 LZW(Lempel-Ziv Welch) algorhythm은 상당히 복잡합니다. 검색엔진에서 LZW라고 쳐 보면 수 십개의 페이지를 찾을 수 있습니다. 저도 자세히 모르기 때문에 대략 어떤 것이다 정도로만 얘기를 해보겠습니다. 먼저 raster 데이타라는 것을 알아야 합니다. 우리가 보고 있는 모니터 화면의 픽셀은 삼원색의 조합입니다. 삼원색 값의 조합을 달리함으로써 픽셀 별로 다른 색깔을 나타냅니다. 이 때, 원색 하나 당 8비트라고 하면 한 픽셀은 8비트 x 3 = 24비트가 됩니다. 검은색을 표현한다면 빨강,파랑,녹색 모두 다 십진수 0(16진수 00, 2진수 00000000)입니다. 반대로 흰색은 삼원색 모두 최대값인 십진수 255(16진수 ff, 2진수 111111111) 값을 가지면 됩니다. 이렇게 픽셀별로 삼원색의 값을 조합하면 다양한 컬러를 표현할 수 있습니다.

삼원색의 각 컬러 하나 당 8비트라고 했는데 그렇다면 총 몇 가지 색깔을 표현할 수 있을까요? 픽셀의 컬러를 빨강-녹색-파랑(RGB;Red-Green-Blue)의 순서로 조합한다고 합시다. 검은색 픽셀은 10진수로 표현하면 (0,0,0)입니다. 흰색은 (255,255,255)입니다. 빨간색 원색은 (255,0,0)입니다. 파란색 원색은(0,0,255)입니다. 회색은 빨강, 녹색, 파랑이 각각 반씩 켜진 상태이므로 (128,128,128)입니다. 이런 방식으로 표현할 수 있는 컬러의 총 갯수는 원색 하나 당 256개의 값을 가질 수 있으므로, [256 x 256 x 256 = 16,777,216]컬러가 됩니다. "24비트 컬러"가 1670여만 컬러를 표현할 수 있는 이유가 이것입니다.

GIF 같은 이미지 포맷은 위와 같이 픽셀 하나하나에 대해 일일이 원색 별로 값을 매기지는 않습니다. 대신 컬러 테이블(색상표)을 갖고 있어서 각 조합수마다 고유의 숫자를 부여하고 있습니다. 특정 픽셀이 어떤 (r,g,b) 값을 갖는다면 이 순서쌍을 대표하는 컬러 테이블상의 값을 이용합니다. 이런 데이타를 "raster 데이타"라 합니다. 그리고 앞에서 본 것처럼 컬러 표현에 중복된 숫자가 자주 등장하므로 중복된 부분을 적당히 줄일 수 있다면 압축이 가능합니다. 그런 압축 알고리듬 중 하나가 LZW 알고리듬입니다. 알고리듬에 관한 자세한 내용은 이 글의 범위를 넘어서므로 여기서 줄입니다.

JPEG은 GIF와 달리 컬러 정보의 문자열을 압축하지 않습니다. JPEG은 인간 시각의 맹점을 이용합니다. 사람의 시각은 밝기의 차이에는 민감하게 반응하지만 색깔이 달라진 것은 잘 분간하지 못합니다. JPEG은 일단 일반적인 픽셀의 RGB 컬러 데이타를 밝기를 나타내는 부분과 색상을 나타내는 부분으로 변환합니다. 그 다음, 밝기 정보를 담고 있는 부분은 그대로 두고 색상 정보를 담고 있는 부분만 그 픽셀에 인접한 두 픽셀 색상의 평균값을 사용합니다. 색상 정보가 인접 픽셀의 색상 정보로 표현되므로 정보의 양이 줄어드는 것입니다. 압축되는 것입니다.

JFIF 포맷에서 사용하는 "YCbCr"이란 방식을 예로 들어 봅시다. Y는 밝기 정보입니다. Cb와 Cr은 컬러 스케일입니다. JPEG 방식은 보통의 RGB 컬러를 밝기와 컬러 스케일로 수학적 변환을 한 다음, 밝기를 나타내는 Y는 그대로 두고 Cb와 Cr은 인접한 두 개의 픽셀 Cb,Cr의 평균값으로 대체합니다. 따라서 전체 이미지 사이즈는 2/3로 줄어듭니다. 3개 픽셀 대신 2개가 남기 때문입니다. 이 때, 우리 눈에 민감하게 느껴지는 밝기 정보는 그대로 유지되면서 색상만 바뀌므로 화면상에 비치는 이미지는 별로 변화가 없어 보입니다. 그 다음, 이미쥐를 8 x 8 블럭으로 나눕니다. 그리고 각 블럭의 밝기 정보와 색상 정보를 DCT라는 복잡한 수학적 과정을 통해 처리해서 이미지 사이즈를 더 줄입니다. 알고리듬의 자세한 내용은 모르더라도 한 가지 분명한 것은 JPEG이 몇 개를 줄여서 평균값을 사용한다는 점입니다. 정보를 잃어 버리는 부분이 있습니다. "lossy compression"이란 그런 뜻입니다. GIF 포맷처럼 기존 정보를 그대로 유지하면서 압축을 하지 않고 없어지는 정보가 있습니다. 우리 눈에는 다 비슷해 보입니다. 이런 JPEG 방식을 통하게 되면 3메가 바이트 이미쥐가 불과 180 KB로 줄어듭니다.

어디에 무엇을 써야 할까?

사진 같은 이미지는 JPEG으로 압축하는 것이 좋습니다. GIF는 256컬러밖에 지원하지 않으므로 사진을 압축하는 데 사용하기가 곤란합니다. 반대로 256컬러 이하를 사용한 '그림'은 GIF로 압축하는 것이 훨씬 더 유리합니다. 이미지의 소실이 없다는 점에서 더욱 그렇습니다.

압축률은 이미지가 어떤 것인가에 따라 달라진다고 합니다. 대체로 사진 같은 이미지일수록 JPEG이 훨씬 더 월등한 압축률을 보여준다고 합니다. 사용 색상이 256 컬러 이하인 경우엔 GIF 쪽이 더 우수한 경우가 많습니다. JPEG은 또한 또렷한 라인을 만드는 데는 사용되기 힘듭니다. 인접 픽셀들의 평균값을 쓰기 때문에 선명한 경계를 갖는 이미지를 만들기가 곤란합니다. 명확한 선분을 그릴 때는 GIF가 더 적절합니다.dog 바탕이 투명한 이미지를 만들 때도 GIF를 써야 합니다. JPEG은 transparency가 지원되지 않기 때문입니다. 애니메이션을 만들 때도 GIF를 쓸 수밖에 없습니다. 플래쉬가 나온 뒤로는 Animated GIF는 잘 쓰이지 않습니다만.

지금 계신 곳은: TECH > [테크] JPEG과 GIF