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

[GIMP] 파이썬으로 플러그인 만들기⑤: 컬러링북 만들기(최종)

by 일코 2023. 1. 31.

지난 포스팅에서는

필터 명령어 pixelize와 관련 파라미터 입력을 클릭 한 번에 처리할 수 있는
Pixelize라는 플러그인을 직접 만들어보았습니다.
팁으로 플러그인에 단축키를 지정하는 방법이나
플러그인 새로고침하는 단축키(Ctrl-Shift-Alt-R)도 알려드렸어요.

 

2023.01.31 - [기타/무료포토샵 gimp 튜토리얼] - [GIMP] 파이썬으로 플러그인 만들기③: 워크플로우 자동화 기초

 

[GIMP] 파이썬으로 플러그인 만들기③: 워크플로우 자동화 기초

지난 포스팅 말미에서는 사용자변수의 image와 drawable 파라미터를 통해 각각 김프의 프로젝트파일, 활성화된 레이어에 접근할 수 있다는 점을 알아보았습니다. 2023.01.31 - [기타/무료포토샵 gimp 튜

martinii.fun

이전까진 간단한 프로시저 한 개만 가지고 플러그인을 만들어보았는데요.
이제 복잡한 워크플로우를 자동화하는 데 필요한
충분한 기초를 다졌다고 생각이 되네요.


그래서 이번 (최종) 포스팅에서는

실질적인 플러그인 예제를 같이 한 번 다뤄보려고 합니다.
굳이 거창하게 이름을 지어보자면

컬러링북 직접 만들기!

흔한 말로 "색칠용 스케치" 같은 거죠...

우리는 집안에서만 쓸 예정이므로
상업용으로 사용하면 안 되는,
딸아이들이 좋아하는 알쏭달쏭 캐치티니핑 같은 이미지를 가지고
컬러링북을 만들어 아이들에게 선물해줍시다. 예를 들면
그 유명한 하츄핑이나...

우측이 원본 png, 좌측이 플러그인 적용 후 모습입니다.

나나핑 같은..

분명 작년까지만 해도 알쏭달쏭 캐치티니핑이 미친 유행이었는데
자신이 없네요. 요즘 다섯살 인싸들은 하도 트렌드가 빨리 바뀌어서ㅜ
"아직도 알쏭달쏭 캐치티니핑이냐" 불평할 수도 있을 것 같아요..
하지만 기술을 알면 캐치티니핑4든 5든 만들어낼 수 있지 않겠어요?^^

 

이미지 출처는 알쏭달쏭 캐치! 티니핑 - 에스에이엠지엔터테인먼트 (samg.net)

 

알쏭달쏭 캐치! 티니핑 - 에스에이엠지엔터테인먼트

하모니 마을에 알쏭달쏭 열쇠티니핑이 나타났다! 게다가 정체를 알 수 없는 수수께끼 티니핑까지 등장하는데…! 과연 로미와 새로운 로열티니핑들은 하모니 마을에 흩어진 열쇠티니핑들을 모

samg.net

 

그럼 어떤 과정의 필터링을 거치는지 알아보겠습니다.
저는 아래 네 개의 필터를 차례대로 적용해봤어요.

① 검정색(파란 티니핑인 바로핑, 믿어핑, 꾸래핑 때문에)의 배경레이어 추가 후 Image Flatten
   - 배경이 있어야 edge-detection 시에 외곽선이 뚜렷하게 감지됩니다.
② Laplace Edge Detection
   - 여러 필터 중에서 가장 노이즈가 적으면서 선이 얇고 깔끔한 알고리즘입니다.
③ Color Inverse
   - 검출한 엣지는 어둡게, 그 외에는 밝게 색반전을 해 줍니다.
④ Grayscale
   - 그레이스케일로 바꾸면 끝!

이미지의 채도나 정밀도 차이에 따라서
최적의 필터링 방법이 다를 수 있습니다.
예를 들면 엣지디텍션보다 매핑이
선을 더 뚜렷이 검출하는 경우도 있고,
옅은 블러링 후 컬러커브를 조작해서
외곽선을 두껍게 만들 수도 있겠습니다.

 

이전 포스팅에서 작업했던 것과 동일하게,
김프 파이썬 콘솔부터 열고
Browse를 눌러 하나씩 찾아가면서 작성해봅니다.

포스팅이 너무너무 길어져서,
지루한 삽질과정은 과감히 삭제하고 결론만 남겨놓았습니다.
양해 바랍니다ㅜ
프로시저 탐색과정은 이전 포스팅과 완전히 동일합니다.

 

완성한 코드는 아래와 같습니다.

#!/usr/bin/python
# -*- coding:utf-8 -*-
from gimpfu import *


def outline(image, drawable):
    # 레이어 추가(기본 전경색이 검정임)
    RGB_IMAGE = 0
    LAYER_MODE_NORMAL = 28
    layer = pdb.gimp_layer_new(image, image.width, image.height, RGB_IMAGE, "Overlay", 100, LAYER_MODE_NORMAL)
    pdb.gimp_image_insert_layer(image, layer, None, 1)
    # 레이어 합성(Image Flatten)
    layer = pdb.gimp_image_merge_visible_layers(image, 1)
    # 엣지디텍션(Laplace Edge Detection)
    # pdb.plug_in_edge(image, drawable, amount, warpmode, edgemode)
    pdb.plug_in_edge(image, layer, 5, 0, 5)
    # 색반전(Color Inverse)
    # pdb.gimp_drawable_invert(drawable, linear)
    pdb.gimp_drawable_invert(layer, True)
    # 그레이스케일
    pdb.gimp_image_convert_grayscale(image)


register(
    proc_name="outline",
    blurb="outliner",
    help="remain outline and make white",
    author="일코",
    copyright="일상의 코딩",
    date="2023-01-31",
    label="_Outline",
    imagetypes="",
    params=[
        (PF_IMAGE, "image", "takes current image", None),  # <-- 파일(.xcf)이름
        (PF_DRAWABLE, "drawable", "Input layer", None),  # <-- 현재 활성화된 레이어 이름
    ],
    results=[],
    function=outline,
    menu="<Image>/_Plugins"  # <-- Plugins라는 메뉴를 만들고 그 하위에 배치
)

main()

 

몇 번 시행착오를 겪다 보면 저절로 아시게 되겠지만
주의할 점이 몇 가지 있습니다.


1. 가끔 browse 코멘트에는 0을 입력하라고 하는데 실행이 되지 않는 경우가 있습니다.
   그런 경우 0 대신 False를 입력하면 잘 실행되는데,
   pdb.gimp_image_insert_layer 프로시저의 parent 파라미터 같은 경우입니다.
   조금 번거롭지만, 프로시저가 실행되지 않는 경우에는
   의심되는 라인 전후로
   (첫 번째 포스팅에서 소개했던) pdb.gimp_message를 실행해보면서
   어느 라인이 문제인지 파악한 후에
   이것저것 바꿔넣어보면 간단하게 해결됩니다.

2. (다시 강조하지만) python-fu는 키워드 인자를 받지 못합니다.
   func(param1=arg1, param2=arg2) 처럼 입력하면 안되고
   func(arg1, arg2) 식으로만 입력해야 합니다.

 

완성한 플러그인을 실행해보면

순식간에 모든 필터가 적용되었습니다.

의도한 대로 잘 변환되었네요.

png로 내보내기 코드도 추가해보겠습니다.

outline 함수의 마지막에 추가해주시면 됩니다.
프로시저 탐색 과정은 이전 포스팅과 동일하므로 생략했습니다.

# png로 저장
# pdb.file_png_save_defaults(image, drawable, filename, raw_filename)
filename = os.path.join(os.getcwd(), './%s.png' % image.name.split(".")[0])
pdb.file_png_save_defaults(image, layer, filename, filename)
pdb.gimp_image_delete(image)

 

여기까지 실행해보면

png로 저장되어 있습니다. 근데 파일명이 좀 이상하네요. 임시프로젝트라 그렇습니다..

 

내친김에 폴더선택 다이얼로그도 붙여서
여러 파일을 한 번에 처리해봅시다.

폴더선택창을 열어서 폴더 안의 모든 png 파일을
배치로 변환하는 코드까지 추가해보겠습니다.

김프에 내장된 파이썬2.7의 Tkinter에서
TkFileDialog.askopenfilenames 등을 실행하려면
Tcl 바이너리를 다운받아 컴파일하는 등 복잡한 과정을 거쳐야 하기 때문에
김프 내장 파일다이얼로그를 사용해보겠습니다.

register 함수에만
아래와 같이 PF_DIRNAME 파라미터를 하나 추가해주기만 하면
자동으로 다이얼로그가 생성됩니다. 간편하죠?
또 재미있는 점은, 폴더선택창이 닫힌 후에 슥삭슥삭 하는 작업과정이 나타나지 않고,
프로그레스바만 움직인다는 점입니다. 플러그인이 깔끔해지네요.

아래는 정말 긴 삽질을 통해 완성한 코드인데,
여러분께 그 과정을 보여드리는 게 큰 의미가 없을 것 같아서
완성된 코드만 보여드립니다.
(실은 프로시저 탐색과 디버깅만 계속 반복했습니다.)

아래 코드는 그대로 여러분의 플러그인에 복사해서 사용하셔도 잘 작동합니다.
변환된 파일들은 바탕화면에 "export" 라는 이름의 폴더를 자동생성하고
그 안에 일괄저장됩니다.

#!/usr/bin/python
# -*- coding:utf-8 -*-
import os

from gimpfu import *

os.chdir(os.path.join(os.environ["USERPROFILE"], "desktop"))
try:
    os.mkdir("export")
except:
    pass
os.chdir("export")


def outline(image, directory):
    # 파일목록
    filelist = os.listdir(directory)
    
    for filename in filelist:
        filename = os.path.join(directory, filename)
        image = pdb.file_png_load(filename, filename)
        
        # 레이어 추가(기본 전경색이 검정임)
        RGB_IMAGE = 0
        LAYER_MODE_NORMAL = 28
        layer = pdb.gimp_layer_new(image, image.width, image.height, RGB_IMAGE, "Overlay", 100, LAYER_MODE_NORMAL)
        pdb.gimp_image_insert_layer(image, layer, None, 1)
        
        # 레이어 합성(Image Flatten)
        layer = pdb.gimp_image_merge_visible_layers(image, 1)
        
        # 엣지디텍션(Laplace Edge Detection)
        # pdb.plug_in_edge(image, drawable, amount, warpmode, edgemode)
        pdb.plug_in_edge(image, layer, 5, 0, 5)
        
        # 색반전(Color Inverse)
        # pdb.gimp_drawable_invert(drawable, linear)
        pdb.gimp_drawable_invert(layer, True)
        
        # 그레이스케일 변환
        pdb.gimp_image_convert_grayscale(image)
        
        # png 포맷으로 내보내기
        # pdb.file_png_save_defaults(image, drawable, filename, raw_filename)
        filename = os.path.join(os.getcwd(), './%s.png' % image.name.split(".")[0])
        pdb.file_png_save_defaults(image, layer, filename, filename)
        
        # 프로젝트 닫기
        pdb.gimp_image_delete(image)


register(
    proc_name="outline",
    blurb="batch outliner",
    help="remain outline and make white",
    author="일코",
    copyright="일상의 코딩",
    date="2023-01-31",
    label="_Outline",
    imagetypes="",
    params=[
        (PF_IMAGE, "image", "takes current image", None),
        (PF_DIRNAME, 'directory', 'Directory', '.'),
    ],
    results=[],
    function=outline,
    menu="<Image>/_Plugins"
)

main()

우리가 함께한 기나긴 입문튜토리얼 과정의
모든 것이 담긴 코드입니다.
새삼 감동이 몰려오네요!

 

마지막으로 실행해보면

의도한 대로 완벽하게 실행되네요.

끝!

멋진 플러그인을 하나 완성해보았습니다.

어떠셨나요?
이 과정을 따라오시면서
분명 여러분의 마음속에도
자동화해 보고 싶은 프로젝트들이 떠올랐을 겁니다.

제 경우는.. (아직 내공이 충분하진 않지만; 상상이라도^^)

① 미드저니에서 특정 사이즈의 이미지를 요청해서 가져온 후에
   김프에서 적당히 명도를 높이고, 텍스트를 얹어서
   외곽선이나 베벨 등 데코를 적절히 넣어 예쁘게 꾸며준 후
   블로그 포스팅 서두에 넣을 이미지로 활용하기?

② face recognition을 통해 인물의 얼굴이나, 음식 좌표를 추출해서
   해당 개체 바깥은 아웃포커싱으로 날려버리는 필터 만들기

③ 아마존 같은 해외쇼핑몰 상세페이지에서
   OCR로 외국어를 검출한 후 한국어로 번역해서
   이질감이 없게 한국어로 덮어주는 프로그램 만들기 어머 이건 꼭 해야 해!

등등.. 상상만 해도 두근두근 하네요.

여러분도
가슴이 두근거리는 플러그인 직접 만들어보시거나
아이디어만이라도 댓글로 공유해주세요^^

그럼 파이썬+김프 자동화 입문 튜토리얼은
이것으로 마치겠습니다.
수고하셨습니다!

 

입문과정을 모두 마치며


아예 김프 포스팅이나 튜토리얼을 앞으로 안 올리겠다는 건 아니고,
앞으로는 좀 더 고급 주제들을 연구해서 틈틈이 공유할 예정입니다.

김프는 튜토리얼에서 느끼셨다시피
API가 굉장히 구체적이고,
문서도 잘 되어 있으며
특히 스크립트 이름이 굉장히 직관적이어서 
빠르게 익히고 만들고 활용할 수 있습니다.
개인적으로는 김프의 API가 정말 만족스럽습니다.

튜토리얼 마지막에 에너지가 딸려서
탐색과정에 대한 설명이 좀 부족하다고 느끼셨을 수 있지만
사실 적절한 명령어 찾아내느라 삽질하고
무작정 반복하면서 디버깅한 게 전부라서
결국 남은 건 포스팅 안의 코드들 밖에 없었습니다.

여러분만의 자동화 스크립트 작성 중에
막히는 부분이 있거나,
궁금한 점이 있으면 메일(martinii.fun@지메일.com) 또는
블로그 방명록에 질문 남겨주시면
가능한한 성의껏 답변을 드리도록 하겠습니다.

마지막으로 아래는
김프 개발자 공식API문서, 그리고
제가 삽질하던 중에 큰 도움이 되었던 사이트들입니다.
많은 선구자 분들 덕에
저도 이렇게 빨리 배울 수 있었습니다.
감사한 마음이 크네요.


https://developer.gimp.org/api/2.0/

 

 

Python Fu #7: More complicated plug-ins, recreating the Lomo effect

See the other tutorials in this series. For our 7th Python-Fu tutorial we are going to make a more complicated plug-on. I made a tutorial for the Lomo effect 4 years ago, and we’re going to a…

jacksonbates.wordpress.com

 

 

BIMP : 김프(GIMP) 이미지 일괄작업 처리 플러그인

글작성시 환경: 리눅스민트 20.1 + GIMP(Flatpak) 2.10.24 BIMP : Batch Image Manipulation Plugin for GIMP. 여러 이미지를 한번에 크기조정(리사이징), 자르기(크롭), 회전/반전, 흐리게/선명하게, 색감조정, 워터마

horangi.co.kr

 

 

gimp python-fu 사용

gimp를 사용하면, 마우스를 많이 클릭해야 한다. 대부분 노가다인데, python-fu를 사용하면 반복 작업을 대폭 줄일 수 있다. 필터 메뉴에서 python 콘솔을 열 수 있다. 해당 코드를 테스트할 경우 유용

now0930.pe.kr

 

 

수고하셨습니다.
그리고 감사합니다.

일코 드림

 

 


국내 유일의 파이썬+한컴오피스 자동화 강의

 

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

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

www.inflearn.com

 

댓글