TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 28 READS

88x31 버튼에 소설 한 권을 담다: ImageMagick로 만든 '책 버튼'

웹을 오래 돌아다녀 본 사람이라면, 특히 개인 홈페이지 중심의 이른바 '스몰 웹(Small Web)'을 기웃거려 본 사람이라면 88x31 픽셀 크기의 작은 버튼을 수없이 마주쳤을 것이다. 사이트끼리 서로를 소개하고 링크를 걸어 주던 이 미니 배너는 초창기 웹 문화의 상징이었고, 일부는 정지 이미지 대신 짧은 애니메이션으로 시선을 끈다. 다만 그 움직임은 대개 눈길을 붙잡거나 몇 개의 단어를 번갈아 보여 주는 정도에 그친다. 한 개발자는 바로 이 지점에 의문을 던졌다. 애니메이션 프레임을 끝까지 밀어붙이면 어떻게 될까. 예컨대 소설 『모비딕』 전체를 88x31 버튼 하나에 담을 수는 없을까.

흥미롭게도 GIF 포맷은 이 무모해 보이는 시도를 가로막지 않는다. GIF의 프레임 수에는 사실상 상한이 없고, 최대 해상도는 2^16 × 2^16, 즉 약 4295메가픽셀에 이른다. 우리가 쓰려는 88x31은 고작 0.003메가픽셀에 불과하니 공간은 넉넉한 셈이다. 문제는 해상도가 아니라 가독성이다. Arial 같은 일반 글꼴은 높이 10픽셀쯤 되어야 겨우 읽을 수 있고, 그 크기로는 88x31 안에 한 번에 열한 단어 정도밖에 넣지 못한다.

작은 글자를 위한 글꼴

해법은 극단적으로 작은 크기에서도 읽히도록 설계된 비트맵 글꼴이다. 3x3 픽셀짜리까지 있지만, 글쓴이는 TomThumb를 가장 균형 잡힌 선택으로 꼽았다. TomThumb는 트루타입(.ttf) 형태로 구할 수 있다. 버튼이 88x31이고 글꼴이 자간을 포함해 6x4(글자 자체는 5x3) 크기라면, 한 프레임에 22자씩 5줄, 즉 110자를 담을 수 있다는 계산이 나온다.

먼저 책의 본문을 순수 텍스트로 확보해야 한다. 종이책은 OCR로 긁고, EPUB이나 PDF는 변환하거나 직접 복사하면 된다. 『모비딕』처럼 아예 .txt 파일로 배포되는 경우도 있어 운이 좋으면 손쉽다. 글쓴이는 파일을 받아 앞뒤의 라이선스 문구를 떼어내고 1장 이전의 모든 내용을 잘라냈다.

POSIX 도구로 줄을 맞추다

ImageMagick은 텍스트 배치에 그리 능하지 않기 때문에 줄 나누기는 미리 처리해 두는 편이 낫다. 여기서 쓰인 방법이 cat, tr, fold 세 가지 유닉스 도구의 조합이다. cat으로 텍스트를 흘려보내고, tr로 모든 줄바꿈을 공백으로 바꿔 전체를 한 줄로 압축한 뒤, fold에 -w 22와 -s 옵션을 주어 단어가 끊기지 않도록 22자 폭으로 다시 나누는 식이다.

이 과정에서 한 가지 함정이 드러났다. fold가 멀티바이트 문자를 제대로 다루지 못해 결과가 깨진 것이다. 글쓴이는 grep -P -n '[^\x00-\x7F]'로 비 ASCII 문자를 찾아낸 뒤 sed로 치환해 정리했다. 예컨대 특수 따옴표를 일반 따옴표로 바꾸는 식이다. 또 장 사이에 여백을 주려고 sed로 'CHAPTER ' 앞에 빈 줄을 넣기도 했는데, 이런 서식 손질은 작품의 성격과 원문의 장 표기 방식에 따라 달라질 수밖에 없는 주관적 영역이다.

프레임을 쌓아 GIF로

정리된 텍스트는 ImageMagick의 convert 명령으로 표준 입력을 통해 받아 한 프레임씩 GIF에 그려 넣는다. 다만 ImageMagick이 이미지 하단에 강제로 여백을 넣는 버릇이 있어, 원하는 높이보다 8픽셀 큰 이미지에 글자를 그린 다음 그 8픽셀을 잘라내는 우회가 필요했다. 동시에 프레임 간 전환 간격은 6초 정도로 잡았다. 글쓴이는 여기에 더해 글자가 왼쪽 가장자리에 바짝 붙는 대신 가운데로 정렬되도록 간단한 파이썬 스크립트를 짜서 출력을 다시 GIF로 만들었다.

결과물은 그 자체로 하나의 유쾌한 사고 실험이다. 1장만 담은 예시와 달리, 『모비딕』 전권을 담은 완성본은 4.2MB 용량에 재생 시간이 19시간을 넘긴다. 실무적으로 보면 이 작업에서 건질 만한 교훈은 분명하다. 전용 도구가 레이아웃에 약할 때는 cat·tr·fold·sed·grep 같은 작은 유닉스 도구를 파이프로 엮어 전처리를 떠맡기는 편이 깔끔하다는 점, 그리고 멀티바이트 인코딩 문제는 이런 텍스트 파이프라인에서 늘 복병이 된다는 점이다. 무엇보다, 포맷의 명세를 곧이곧대로 읽고 관행의 경계를 한 뼘 넘어서는 것만으로도 익숙한 도구에서 전혀 다른 쓸모가 튀어나올 수 있다는 사실이야말로 이 자잘한 해킹이 남기는 가장 큰 재미다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://k.sosnierz.me/08-11-24/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...