mieki256's diary



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

imageoblique_about.png

_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

試してみたら、たしかに数倍の速度で動いた。素晴らしい。
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によるプラグイン開発

以上、1 日分です。

過去ログ表示

Prev - 2015/03 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project