김프(Gimp), 스킴(Scheme)을 이용한 이미지 크기 자동 변환 매크로와 UI 작업.

2018. 12. 16. 18:48참고

(이름 짓기 젤 어려워. ㅠㅠ)



지난달 초 7개의 UI를 확정했는데 오늘까지 11개 작업하고 1차 외형 작업을 마무리합니다. (추가 UI 계속 늘어나는 중...캭!!)


UI 작업은 그 내부에 흐르는 성장 데이터 구조와 서버 통신에 필요한 패킷 검증 설계를 포함하는데 문제는 이게 아니었습니다.


UI에 사용되는 다양한 아이콘! 

이번 1차 작업에서 확보한 아이콘이 3천 개 이상.

개발 편의성을 위해 작은 크기로 바꿔서 하나의 아틀라스에 포함하려니 일괄 크기 변형이 필요하네요.


3천개 정도는 그냥 손으로 바꿔도 금방이지... 뭣!?


256 혹은 512 크기의 아이콘을 64로 줄이는데 자동화가 절실했습니다.

관련 매크로를 찾았더니... Gimp에서는 Scheme 정보가 많네요. 

그래서 Scheme을 습득하고 관련 매크로를 찾아서 변환에 성공하는데 다시 칠흑 같은 3일을 보냈습니다. -_ -




지금은 파이썬으로 바꾸었다지만 그전에는 스킴을 MIT에서 기본으로 가르쳤다고 하네요. (김프도 이미 파이썬으로...)

스킴 설명 영상을 찾아보았습니다.


Script-fu and Scheme (스킴 매크로)


아래 영상에 이은 3개의 영상을 보면 그럭저럭 응용 스크립트를 사용할 수 있습니다.




작업 환경 (준비는 각자 알아서...)

* Gimp 2.10.8

* Bash 콘솔 연결한 VSCode


그럼 먼저 폴더에서 *.png를 찾아서 이미지 크기를 변환하는 Scheme 코드를 소개합니다.


batch-resize-rename.scm

 


(define (extract-filename orig-name)
(car (strbreakup orig-name "."))
)

(define (extract-extname orig-name)
(cadr (strbreakup orig-name "."))
)

(define (batch-resize-rename pattern width height tag)
(let* ((filelist (cadr (file-glob pattern 1))))
(while (not (null? filelist))
(let* ((filename (car filelist))
(image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
(drawable (car (gimp-image-get-active-layer image))))
(gimp-image-scale-full image width height INTERPOLATION-CUBIC)
(let* ((filename-only (extract-filename filename)) (ext-only (extract-extname filename)))
;(print filename)
;(print filename-only)
;(print tag)
;(print ".")
;(print ext-only)
;(let* ((nfilename (string-append filename-only tag "." ext-only)))
; (gimp-file-save RUN-NONINTERACTIVE image drawable nfilename nfilename))
(let* ((nfilename (string-append tag filename)))
(gimp-file-save RUN-NONINTERACTIVE image drawable nfilename nfilename))
)
(gimp-image-delete image)
)
(set! filelist (cdr filelist))
)
)
)


batch-resize-rename 함수에 인자 4개를 받습니다.

pattern : "*.png"

width : 크기 변환할 이미지 가로 크기, 여기서는 64

height : 크기 변환할 이미지 세로 크기, 여기서는 64

tag : 크기 변환한 이미지 파일 앞에 붙일 이름, 여기서는 "(64x64)"


그리고 위 스킴 스크립트를 모든 하위 폴더에 있는 png 파일에 적용하려고 bash 스크립트를 구성합니다.


auto_resize_all.sh

 


# 하위 폴더의 모든 png 파일을 gimp scheme batch-resize-rename 사용하여 변환
for d in `find .`; do
if [ -d "$d" ]; then
pushd ./ > /dev/null
cd "$d"
for i in *.png *.PNG; do
if [ -e "$i" ]; then
echo "$d"
#echo "$i"
#gimp-console-2.10 -i -b '(batch-resize-rename "*.png" 64 64 "(64x64)")' -b '(gimp-quit 1)'
gimp-console-2.10 -i -b '(batch-resize-rename "*.png" 64 64 "(64x64)")' -b '(gimp-quit 0)'
break
fi
done
popd > /dev/null
fi
done

(현재 폴더의 모든 하위 폴더에 png 파일이 있으면 스킴 스크립트를 호출합니다.)


스킴 스크립트 호출

gimp-console-2.10 -i -b '(batch-resize-rename "*.png" 64 64 "(64x64)")' -b '(gimp-quit 0)'



몇가지 주의 사항.

* vscode bash 콘솔에서 gimp-console 실행 파일 폴더를 path 연결하세요.

* 새 콘솔창에서 진행 된다면 gimp.exe로 실행한 것이 아닌지 확인하세요.

(저는 gimp에서 gimp-console로 바꿔 사용했는데 새 창이 떠서 안되다가 갑자기(?) 함수를 찾을 수 없다는 에러와 함께 정상(?) 작동했습니다. ㅋ)


이제 3천 개의 아이콘이 다 변환될 때까지 다른 일을 합니다.


자동화해도 1시간 가까이 걸렸습니다.


UI 작업은 디자인 감각이 필요해서 폴리싱에 무한의 시간이 필요합니다.

이렇게 물량 난이도를 앞세운 두 번째 허들 "시간의 블랙홀"을 무사히 넘었습니다. ㅋ


이제 준비된 구슬들을 하나씩 게임 흐름에 맞게 꿰어야하는 세 번째 허들, 월드 작업이 기다리고 있네요.


긴 작업이기 때문에 매주 진행 상황을 블로그로 남길 생각입니다.


ㄱㄱ~