글쓰기는 단어만 다루는 작업이 아닙니다. 글쓴이는 이미지도 함께 다뤄야 하는 경우가 많습니다. 특히 기술 문서 작성에서는 기술과 프로세스를 전달하기 위해 수많은 스크린샷을 활용하게 됩니다. 그런데 게시 플랫폼마다 이미지 형식이나 파일 크기 등 요구 사항이 다를 수 있습니다.
IT 컨설턴트이자 시스템 엔지니어로 일하면서 저는 고객에게 전달할 기술 문서를 수없이 작성해 왔습니다. 대개 Microsoft Word(.doc) 형식이 요구되었죠. 문서는 내용이 추가될수록 빠르게 방대해집니다. 초창기에는 스크린샷이 비트맵(.bmp)으로 저장되곤 했는데, 이 형식은 파일 크기가 매우 큽니다. 서버에 운영체제를 설치하는 과정을 설명하는 문서는 어마어마한 용량의 파일이 되어버리곤 했습니다.
이미지를 알아볼 수 없을 정도로 품질을 떨어뜨리지 않으면서 크기를 줄이는 일은 지루하고 힘든 작업이었습니다. 비트맵은 JPEG 파일로, 나중에는 PNG 파일로 변환할 수 있었지만, 제가 오피스 스위트를 LibreOffice로 바꾼 이후에도 편집은 여전히 만만치 않은 과제였습니다. 다행히 오늘날 대부분의 스크린샷 도구는 PNG처럼 작은 용량의 형식으로 저장합니다.
Opensource.com은 아티클에 사용되는 이미지에 일정한 제한을 두고 있습니다. 저는 아티클용 이미지를 준비하는 간단한 3단계 방법을 개발했습니다. 첫 번째 단계는 창 크기를 조절하거나 글꼴을 변경하는 등 촬영 단계부터 똑똑하게 준비하는 것입니다. 나머지 두 단계는 매우 반복적인 작업인데, 이미지가 600픽셀 너비 제한을 넘지 않도록 확인하는 것과 테두리를 적용하는 것입니다.
prepimg.sh 스크립트
저는 이런 작업을 처리하기 위해 prepimg.sh라는 Bash 스크립트를 작성했습니다. 이 스크립트는 ImageMagick 스위트의 두 가지 도구를 사용합니다.
이미지 크기 조절
스크린샷 유틸리티는 Screenshot-20210923222312.png처럼 일반적인 이름으로 Pictures 디렉터리에 이미지를 저장합니다. prepimg.sh 스크립트는 이 디렉터리에 있는 파일들의 픽셀 너비를 확인하고, 한도를 초과하는 파일의 크기를 조절합니다. 이 단계에서는 ImageMagick 스위트의 identify 프로그램으로 너비(%w)를 구합니다.
$ identify -format %w Screenshot-20210903202655.png
1217
너비 값은 변수 W에 할당되어 600이라는 한도와 비교하는 데 사용됩니다. 한도 자체는 $MAXWIDTH 변수를 통해 설정할 수 있습니다. 너비가 MAXWIDTH를 초과한다고 판단되면 ImageMagick의 또 다른 프로그램인 convert를 호출해 이미지 너비를 줄입니다. 다음은 스크립트의 이미지 처리 함수입니다:
if [ "$W" -gt "$MAXWIDTH" ]
then
[[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
convert -resize "${MAXWIDTH}" \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"
...
이미지는 필요에 따라 크기가 줄어들어 $READY 변수로 정의된 별도의 디렉터리에 저장됩니다. 여기서 이미지는 실제로 약간 더 작은 598픽셀로 조절되는데, 이는 다음에 설명할 테두리 추가를 위한 여유 공간을 확보하기 위함입니다.
이미지에 테두리 추가
때로는 이미지가 웹 페이지 배경과 뒤섞여 보일 수 있습니다. 이미지 가장자리까지의 전경색이 사이트 배경색과 같기 때문입니다. 예시는 다음과 같습니다:

테두리가 없는 이미지. (CC BY-SA 4.0)
위 이미지에서 볼 수 있듯이 이미지의 경계가 어디인지 전혀 알 수 없습니다. 이 문제는 흰색에만 국한되지 않습니다. 각 사이트와 사용 중인 테마 색상에 따라 달라지므로, 배경이 빨간색이고 이미지 가장자리도 빨간색이라면 같은 문제가 발생합니다. 제 스크립트는 convert 도구로 이 문제를 해결합니다. -border 옵션은 각 이미지 파일에 1픽셀 크기의 테두리를 추가합니다. 이 옵션만으로 충분하지만, -bordercolor 옵션으로 색상까지 지정하면 더욱 좋습니다. 예시는 다음과 같습니다:
convert -bordercolor black -border 1 Screenshot-20210903202655.png
아래는 테두리가 추가된 동일한 이미지입니다. 훨씬 보기 좋지 않나요?

테두리가 있는 이미지. (CC BY-SA 4.0)
이미지 준비 완료
for 루프로 스크린샷 디렉터리를 순회하며 각 파일마다 process_img 함수를 호출합니다. 이 함수가 너비 조절과 테두리 추가를 모두 처리합니다. 전체 코드에는 파일이 실제로 이미지인지 확인하는 등의 기본 검증 절차도 포함되어 있습니다.
process_img() {
# verify that file is an image file, and then get dimensions
if file "${SCREENSHOTS}"/"${1}" | grep -qE 'image|bitmap'; then
[[ $VERBOSE -gt 0 ]] && echo "${1} is an image"
W=$(identify -format %w "${SCREENSHOTS}"/"${1}")
else
echo "File ${SCREENSHOTS}/${1} is not an image."
W=0
fi
# resize and border
if [ "$W" -gt "$MAXWIDTH" ]
then
[[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
convert -resize "${MAXWIDTH}" \
-bordercolor $BORDER \
-border 1 \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"
else
convert -bordercolor $BORDER \
-border 1 \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"
fi
}
스크립트의 마지막 단계는 처리된 파일들을 $READY 변수로 지정된 Ready라는 하위 디렉터리에 저장하는 것입니다. 이렇게 하면 원본 파일이 그대로 보존되어 이후에도 재사용할 수 있습니다.
사용법
prepimg.sh는 인자와 사용법을 설명하는 기본적인 도움말 기능도 갖추고 있습니다:
$ prepimg.sh -h
prepimg.sh Version 0.7 - written by Alan Formy-Duval
prepimg.sh [OPTIONS]
--verbose, -v Be verbose
--directory, -d Screenshot directory (default: /home/alan/Pictures/Screenshots)
--ready, -r Ready directory (default: /home/alan/Pictures/Screenshots/Ready)
--border, -b Border color (default: black)
코드와 결론
이 글에 소개된 코드는 완전하지 않으며 의사 코드(pseudocode)로 간주해야 합니다. 완전한 스크립트는 저자의 Git 저장소에서 확인할 수 있습니다.
ImageMagick 스위트는 이미지를 조작하기 위한 강력한 도구 모음입니다. 제 작은 스크립트에 포함된 기능 외에도 훨씬 더 많은 작업을 수행할 수 있습니다. 필진 Jim Hall 역시 최근 이 도구를 활용해 이미지 크기를 조절하는 방법에 대한 글을 발표했습니다.
Bash 스크립팅을 선호하든 C나 Python처럼 다른 언어로 코딩하든, 자동화는 큰 도움이 됩니다. 저는 몇 줄의 코드가 얼마나 많은 골칫거리를 덜어주고, 우리가 시간을 더 생산적으로 활용할 수 있게 해주는지 여러 번 직접 경험했습니다.