본문 바로가기
기타/무료포토샵 gimp 튜토리얼

[GIMP] 파이썬으로 플러그인 만들기①: 오류콘솔에 "Hello, world!"

by 일코 2023. 1. 30.

최근 GIMP를 배우는 데 박차를 가하던 중에
페북에 간단한 튜토리얼을 올렸는데
한 페친 분께서 이런 댓글을 남겨주셨어요.

여차저차해서 시작하게 된 튜토리얼이지만,
사실 예전부터 만들어 보고 싶은 플러그인이 있긴 했거든요ㅎㅎ

바로, 썸네일 자동생성기!

아니, 이 튜토리얼에서 다룰 내용은 아니고...

먼 여정의 첫 걸음은 역시 헬로월드지.

 

해외 포스팅과 스택오버플로, 유튜브 동영상을 뒤진 끝에
첫 걸음을 내딛게 되었으니..
이 튜토리얼 시리즈는 제 배움의 여정이자
제가 다시 읽기 위한 기록이므로 여러분께는 다소 불친절할 수 있다는 점, 양해 바랍니다^^
오늘은 김프의 파이썬 플러그인 구조와, 등록방법
그리고, 가장 간단한 튜토리얼인 헬로월드 찍기를 보여드리려고 해요.

이번 포스팅의 목차는,

① 파이참 연동하기
② 오류콘솔에 헬로월드 찍는 플러그인 만들기

딸랑 두 개지만 분량은 다소 길어질 것 같네요.


① 먼저 파이참 연동하기

김프를  실행하고 다음과 같이
필터 - Python-Fu - 콘솔(C) 메뉴를 찾아가면
김프에 내장된 파이썬 콘솔이 실행됩니다.
그런데 버전이 무려 2.7!!? 클래식하네..

비록 파이썬3는 사용할 수 없지만,
복잡한 문법이나 문자열 조작을 쓸 일은 거의 없거니와
한글이야 안 쓰면 되고, 주의할 건 정수 나눗셈이 반올림된다 정도?
저도 다행히 2.7로 파이썬에 입문해서 크게 이질감은 들지 않았어요.

이 콘솔은 딱 한 군데 쓸모가 있는데...

바로 PDB(김프 파이썬 프로시저 데이터베이스)를 조회할 수 있다는 것, 그 이상은 아닙니다.
나중에 프로시저에 익숙해지면 이 콘솔에서도 어느 정도 스크립팅을 할 수 있게 될까요?ㅎㅎ


메인 함수에 들어갈 pdb의 모든 메서드와 파라미터 정보와 설명을 여기서 읽을 수 있어요.
그리고 콘솔에서 한 줄씩 복사해서 파이참 에디터에 붙여넣을 수 있고요.

김프 콘솔은 여기까지만 훑어보고
이제 파이참을 실행해봅시다.

Pure Python으로 새 프로젝트를 생성하되,
인터프리터는 "C:\Program Files\GIMP 2\bin\python.exe"로,
프로젝트 폴더는 "C:\Program Files\GIMP 2\lib\gimp\2.0\python"로 지정해주세요.

인터프리터 지정은, 김프 내장 파이썬인 2.7을 선택하기 위함이고,
프로젝트 폴더는 해당 모듈파일들이 전부 저 폴더 안에 들어있어서,
임포트문을 추가/수정하지 않아도 되거든요.
그런 부분이 귀찮지 않다면 별도의 프로젝트 폴더를 만들고
관련모듈을 전부 복사해오는 방법도 괜찮겠네요.
어차피 파이참에서는 코드를 작성하기만 하지,
실행하지는 않을 거거든요.

 

프로젝트를 생성하셨으면 여러분의 PC 화면도 대략 아래와 같겠지요?

이제 두 가지 작업을 해줍니다.

(1) 프로젝트 루트에 template.py 파일을 만들고 아래 코드를 복사해서 붙여넣기

# -*- coding: utf-8 -*-
# 참고로 필자는 시스템 로케일에 utf-8을 사용중이어서 위와 같이 적용함.
# 김프 플러그인이 추가되지 않으면 인코딩 문제일 확률이 높으므로
# utf-8을 cp949나 euc-kr로 변경해볼 것.

from gimpfu import *


def NAME_OF_MAIN_FUNCTION(image, drawable):
    # function code goes here...
    pass


register(
    proc_name="python-fu-NAME-OF-MAIN-FUNC",  # 스크립트 이름
    blurb="SHORT DESCRIPTION",  # 짧은 설명
    help="LONG DESCRIPTION",  # 도움말 문자열
    author="ILCO",  # 저자명
    copyright="ILSANG CODING",  # 저작권 정보
    date="2023-01-30",  # 저작권 연도
    label="NAME FOR MENU",  # 메뉴의 이름(메뉴에 보여질 이름)
    imagetypes="",  # 작업할 이미지 유형, type of image it works on (*, RGB, RGB*, RGBA, GRAY etc...)
    params=[
        # basic parameters are: (UI_ELEMENT, "variable", "label", Default)
        (PF_IMAGE, "image", "takes current image", None),
        (PF_DRAWABLE, "drawable", "Input layer", None),
        # PF_SLIDER, SPINNER have an extra tuple(min, max, step)
        # PF_RADIO has an extra tuples within a tuple:
        # eg. (("radio_label", "radio_value"), ...) for as many radio buttons
        # PF_OPTION has an extra tuple containing options in drop-down list
        # eg. ("opt1", "opt2", ...) for as many options
        # see ui_examples_1.py and ui_examples_2.py for live examples
    ],
    results=[],  # 어디에도 쓰이지 않는다...고 한다.
    function=NAME_OF_MAIN_FUNCTION,
    menu="<Image>/File")  # second item is menu location


main()  # 다른 함수가 있더라도 main()이 마지막으로 호출됨.

뭔가 엄청나게 긴 것 같지만,
읽어보시면 함수 세 개입니다.

(1) 우리가 작성할 사용자정의 함수,
(2) 사용자정의 함수의 등록정보를 입력하는 register 함수,
(3) 위 두 개의 함수를 김프에 등록하는 main함수

함수 하나씩 간략히 살펴보겠습니다.

1) 사용자 정의 함수

def NAME_OF_MAIN_FUNCTION(image, drawable):
    # function code goes here...
    pass

우리가 작성하게 될(이번 포스팅에서는 헬로월드 출력하기) 함수입니다.
왠만한 경우에는 필수 파라미터로 image와 drawable이 들어갑니다.
image는 (그림파일이 아니라) 김프 프로젝트 자체를 가리키게 되고,
drawable은 초기에 활성화되었던 레이어를 자동으로 가리키게 됩니다.

엄청나게 주의하셔야 할 사항을 미리 말씀드립니다.
앞으로도 몇 번 더 강조해서 알려드릴텐데
사용자정의 함수안에 들어가는 pdb 프로시저에는
인자를 적지 않고, 인수만 적어야 합니다.

예를 들면
func(param1=arg1, param2=arg2) 처럼 작성하면
(오류메시지도 없이) 오류가 발생합니다.
func(arg1, arg2)로 작성해야만 정상적으로 실행됩니다.

 

이번 포스팅에서는 파라미터를 하나도 쓰지 않을 예정입니다...

 

2) 등록함수 register

register(
    proc_name="python-fu-NAME-OF-MAIN-FUNC",  # 스크립트 이름
    blurb="SHORT DESCRIPTION",  # 짧은 설명
    help="LONG DESCRIPTION",  # 도움말 문자열
    author="ILCO",  # 저자명
    copyright="ILSANG CODING",  # 저작권 정보
    date="2023-01-30",  # 저작권 연도
    label="NAME FOR MENU",  # 메뉴의 이름(메뉴에 보여질 이름)
    imagetypes="",  # 작업할 이미지 유형, type of image it works on (*, RGB, RGB*, RGBA, GRAY etc...)
    params=[
        # basic parameters are: (UI_ELEMENT, "variable", "label", Default)
        (PF_IMAGE, "image", "takes current image", None),
        (PF_DRAWABLE, "drawable", "Input layer", None),
        # PF_SLIDER, SPINNER have an extra tuple(min, max, step)
        # PF_RADIO has an extra tuples within a tuple:
        # eg. (("radio_label", "radio_value"), ...) for as many radio buttons
        # PF_OPTION has an extra tuple containing options in drop-down list
        # eg. ("opt1", "opt2", ...) for as many options
        # see ui_examples_1.py and ui_examples_2.py for live examples
    ],
    results=[],  # 어디에도 쓰이지 않는다...고 한다.
    function=NAME_OF_MAIN_FUNCTION,
    menu="<Image>/File")  # second item is menu location

register의 모든 파라미터는 하나라도 빼먹으면 런타임시 오류를 뱉습니다.
빈 문자열이라도 꼭 넣어주셔야 합니다.

이 중 특히 중요한 파라미터는 proc_name, label, params, function, menu 등 다섯 개인데,
proc_name은 프로시저의 이름,
label은 메뉴화면에 나타나는 이름,
params는 위 사용자정의 함수에서 사용하는 파라미터, (서로 일치해야 합니다.)
function은 우리가 정의한 사용자정의함수,
menu는 사용자정의함수의 메뉴위치입니다.

3) 메인함수 main()

main 함수는 김프 실행 시점에 사용자함수 및 등록정보를 정의한 후
김프, 파이썬 콘솔의 버전확인 등 호환성 점검 후... 하여튼 김프 메뉴에 싣는
메인함수 역할을 합니다. 가장 마지막에 실행됩니다.

template.py에 대한 설명은 이것으로 마치고,
두 번째 해 줄 작업은 바로

(2) 김프를 열어 플러그인 폴더 추가하기

입니다.

먼저 파이참에서 프로젝트 루트에 plug-ins라는 폴더를 하나 생성해줍니다.
(이 폴더를 김프 플러그인 폴더목록에 추가할 예정입니다.)

이제 김프창을 열고 편집-기본설정 메뉴를 눌러줍니다.

 

기본설정 창을 열면 좌측 패널 제일 하단에 폴더 - Plug-ins 메뉴를 선택하고
C:\Program Files\GIMP 2\lib\gimp\2.0\python\plug-ins 를 복사해서 추가해줍니다.

이제 야크털깎기가 다 끝났습니다! (김프는 재시작해줍니다.)

 

② 오류콘솔에 헬로월드 찍는 플러그인 만들기

이제 남은 건
헬로월드를 오류콘솔에 출력하는 스크립트를 만들어보고
테스트해보는 일만 남았습니다.

파이참을 다시 열어서
plug-ins 폴더 안에다 hello-warning 이라는 폴더를 만들고
그 안에 hello-warning.py를 생성합니다.
폴더명과 파일명이 동일해야 합니다.

plug-ins 폴더 안에 바로 hello-warning.py를 생성해도 플러그인으로 잘 등록되기는 합니다.
다만, 스택오버플로 답변 중에
향후 김프 업데이트시에는 py파일명과 동일한 이름의 폴더를 만들고
그 폴더 안에 py파일을 넣어야만 인식하게 할 예정이라고 하더라고요...
(이 답변이 올라온지 벌써 몇 년이 흘렀는데 아직도?)

이렇게 생성을 완료했으면
hello-warning.py 파일을 편집해줍시다.

저는 아래와 같이 작성했습니다.

#!/usr/bin/python
# -*- coding:utf-8 -*-
# 김프 플러그인이 추가되지 않으면 인코딩 문제일 확률이 높으므로
# utf-8을 cp949나 euc-kr로 변경해볼 것.
#
# 플러그인 최상단에 #!/usr/bin/python 을 넣으면
# 플러그인 실행시 콘솔창이 나타나지 않음.


from gimpfu import *


def hello_warning():
    pdb.gimp_message("Hello, world!")


register(
    proc_name="python-fu-hello-warning",
    blurb="Hello world warning",
    help="Prints 'Hello, world!' to the error console",
    author="일코",
    copyright="일상의 코딩",
    date="2023-01-30",
    label="헬로월드",
    imagetypes="",
    params=[],
    results=[],
    function=hello_warning,
    menu="<Image>/File")

main()

 

hello_warning 함수를 작성할 때에는
아래와 같이 김프의 pdb를 참고합니다.

파이썬 콘솔에서 "찾아보기"를 누른 후
"message"로 검색해봅시다.
gimp-message라는 프로시저(일종의 함수)가 검색됩니다.

Displays a dialog box with a message.

설명을 읽어보면

김프 내부 프로시저.
Displays a dialog box with a message.

매개변수 : message STRING Message to display in the dialog
추가정보 : Displays a dialog box with a message.
           Useful for status or error reporting.
           The message must be in UTF-8 encoding.

라고 씌어 있네요. 굳이 중요한 정보라면 각 파라미터와 자료형 정도입니다. 이건 참고만 하시고

위 정보를 참고해서 hello-warning 플러그인을 완성했으니
이제 김프를 재실행해봅시다.

파일메뉴 맨 아래에 "헬로월드" 보임?ㅎ

 

메뉴에 "헬로월드" 레이블이 추가됐어요!
실행해봅시다!ㅎ

끝!

 

마치며

작고 귀여운 첫 김프-파이썬 스크립트 "헬로월드"를 작성하고
플러그인 등록 후 실행까지 해보았습니다.

저는 온갖 시행착오에
숨겨진 콤마 오타를 찾아내느라 쩔쩔맸는데,
포스팅으로 정리해놓고 나니 아무 것도 아니네요..

이미지 처리 자동화에 관심이 있으신 분들
이 포스팅 시리즈 참고하셔서
원하시는 작업 자동화에 도움이 되길 바랍니다.
긴 글 읽어주셔서 감사해요!

행복한 하루 되세요!

다음 포스팅은

2023.01.31 - [기타/무료포토샵 gimp 튜토리얼] - [GIMP] 파이썬으로 플러그인 만들기②: image와 drawable 다루기 기초

 

[GIMP] 파이썬으로 플러그인 만들기②: image와 drawable 다루기 기초

지난 포스팅에서는 김프의 오류 로그창에다 "Hello, world!"를 찍어보았습니다. 우리가 만든 플러그인이 제대로 작동한다는 걸 직접 확인해보았어요. 2023.01.30 - [기타/무료포토샵 gimp 튜토리얼] - [GIM

martinii.fun

 


국내 유일의 파이썬-아래아한글 자동화 강의

 

움짤로 빠르게 배우는 파이썬-아래아한글 자동화 레시피 - 인프런 | 강의

파이썬으로 아래아한글을 다루는 짧은 예제코드들을 소개하고, 중간중간의 결과를 GIF로 보여드립니다. 동영상 강의가 아니지만 오히려 빠르게 배울 수 있고, 따라하기도 쉽습니다., - 강의 소개

www.inflearn.com

 

김프 기본기능 튜토리얼(연재중)

2023.01.28 - [기타/무료포토샵 gimp 튜토리얼] - [gimp 입문 튜토리얼] 캐릭터 입술에 립스틱 옅게 바르기 #레이어마스크

 

[gimp 입문 튜토리얼] 캐릭터 입술에 립스틱 옅게 바르기 #레이어마스크

포토샵의 무료대안으로 가장 많이 알려진 GIMP의 튜토리얼을 하나씩 올릴 예정입니다. 이번 포스팅에서는 특정 범위를 마스킹하고, 색을 입히는 과정을 차근차근 설명드리겠습니다. 원본 이미지

martinii.fun

댓글