본문 바로가기
개발/기타

GIMP에서 Scheme 스크립트로 이미지 자동 크기 조절하기.

by 레조 2024. 5. 16.

예삐의 모험

 

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

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

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

 

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

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

 

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

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

https://www.youtube.com/watch?v=dAuJJ6P8Jxs

 

https://www.youtube.com/watch?v=ZoMMZeT8frM

 

https://www.youtube.com/watch?v=l2yhdaJhje8

 

작업 환경

* 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)

 

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시간 가까이 걸렸습니다.