2015/03/01(日) [n年前の日記]
#1 [gimp] 画像を斜めにするGIMP-Pythonスクリプトを書いた
数日前に、画像を斜めにするGIMPスクリプト or プラグインを探したのだけど見つからなかったので、GIMP-Python だか Python-fu だかの勉強も兼ねて自分で書いてみたり。pixel単位・dot単位で、横方向に rotate するというか、shift するというか。
環境は Windows7 x64 + GIMP 2.8.10 Portable (+ Python 2.7.5)。
_image-oblique.py
Gistとやらにアップロードしてみたけど、見えるのだろうか…。とりあえず、 Public Domain / CC0 ってことで。
時間測定用の行も残ってるけど、自分で使う分にはこれで充分なのでいいやと。まあ、ドット絵を作る時しか使い道が思いつかないし、需要は無さそうだけど。
環境は Windows7 x64 + GIMP 2.8.10 Portable (+ Python 2.7.5)。
_image-oblique.py
Gistとやらにアップロードしてみたけど、見えるのだろうか…。とりあえず、 Public Domain / CC0 ってことで。
時間測定用の行も残ってるけど、自分で使う分にはこれで充分なのでいいやと。まあ、ドット絵を作る時しか使い道が思いつかないし、需要は無さそうだけど。
◎ 呼び方が分からん。 :
GIMP-Python、Python-fu、どっちの呼び方のほうがいいのでしょうか。
◎ Python-fuを書いてみて。 :
最初、処理があまりに遅くて、「さすがに Python では荷が重いか。画像内の全ドットを処理してるもんな」「こういうのはCで書かなきゃダメかなあ」と思ったけれど。諦めきれずにググっていたら、Python-fuでも高速に処理する方法があると知り。
_Fast Pixel Ops in GIMP-Python (Shallow Thoughts)
_GIMP Scripting: Pixel regions
試してみたら、たしかに数倍の速度で動いた。素晴らしい。
ただ、array とやらの使い方がわからん…。解説記事中ではいきなり array(...) と書いてるけどそれだとエラーが出てしまって。ファイルの最初のほうに、from array import array を書いてみたけど、これでいいのだろうか。
もう一つ、メニューに登録する部分、register関数とやらの書き方が2種類あるようでハマったり。詳しくは以下の記事で解説されてた。ありがたや。メニュー登録指定をどこに書くかで、パラメータリストに含める内容も変わるらしいので注意。
_【Gimp】Pythonによるプラグイン開発
_Fast Pixel Ops in GIMP-Python (Shallow Thoughts)
_GIMP Scripting: Pixel regions
試してみたら、たしかに数倍の速度で動いた。素晴らしい。
from array import array # 中略 def _image_oblique(img, layer, sftx, sfty): u""" add dest layer. """ x1, y1, x2, y2 = layer.mask_bounds w = x2 - x1 h = y2 - y1 src = layer.get_pixel_rgn(x1, y1, w, h, False, False) dst = layer.get_pixel_rgn(x1, y1, w, h, True, True) src_pixels = array("B", src[x1:x2, y1:y2]) p_size = len(src[x1, y1]) dst_pixels = array("B", "\x00" * (w * h * p_size)) for y in range(h): for x in range(w): sx = (x - int(float(sftx) * y)) % w sy = (y - int(float(sfty) * x)) % h src_pos = (sx + w * sy) * p_size dst_pos = (x + w * y) * p_size v = src_pixels[src_pos: src_pos + p_size] dst_pixels[dst_pos : dst_pos + p_size] = v gimp.progress_update(1.0 * y / h) dst[x1:x2, y1:y2] = dst_pixels.tostring() layer.flush() layer.merge_shadow(True) layer.update(x1, y1, w, h)
ただ、array とやらの使い方がわからん…。解説記事中ではいきなり array(...) と書いてるけどそれだとエラーが出てしまって。ファイルの最初のほうに、from array import array を書いてみたけど、これでいいのだろうか。
もう一つ、メニューに登録する部分、register関数とやらの書き方が2種類あるようでハマったり。詳しくは以下の記事で解説されてた。ありがたや。メニュー登録指定をどこに書くかで、パラメータリストに含める内容も変わるらしいので注意。
_【Gimp】Pythonによるプラグイン開発
[ ツッコむ ]
以上です。