mieki256's diary



2017/04/21(金) [n年前の日記]

#1 [gimp][python] Python-Fuのregister関数でハマった

GIMP の Python-Fu について実験していたのだけど。Python-FuスクリプトをGIMPのメニューに登録する際に使う register関数の指定の仕方でハマったり。

巷のサンプルを参考にして打ったつもりが、実行すると「3つの引数が要求されてるのに1つしかきてねえぞ」と延々怒られて。

原因は…。Python-Fuのregister関数には2種類の書き方があって、どちらの書き方にするかでパラメータの記述の仕方も変わってくる、ということを忘れていたせいだった。

以下は、古い書き方。
from gimpfu import *

def my_example_plugin_main(timg, tdrawable, msg):
    """main func."""
    gimp.message("Hello, World: " + msg)

register(
    "python_fu_FUNCTION_NAME",
    "Python-Fu example",
    "help",
    "Your name",
    "Your name",
    "2017/04/20",
    "<Image>/Filters/Languages/Python-Fu/Python-Fu example...",
    "RGB*",      # Alternately use RGB, RGB*, GRAY*, INDEXED etc.
    # params (type, name, description, default [, extra])
    [
        (PF_STRING, "msg", "Text string", 'Hello, world!')
    ],
    # return vals
    [],
    my_example_plugin_main  # function name
)

main()

以下は、新しい書き方。
from gimpfu import *

def my_example_plugin_main(timg, tdrawable, msg):
    """main func."""
    gimp.message("Hello, World: " + msg)

register(
    "python_fu_FUNCTION_NAME",
    "Python-Fu example",
    "help",
    "Your name",
    "Your name",
    "2017/04/20",
    "Python-Fu example...",
    "RGB*",      # Alternately use RGB, RGB*, GRAY*, INDEXED etc.
    # params (type, name, description, default [, extra])
    [
        (PF_IMAGE, "timg", "Input image", None),
        (PF_DRAWABLE, "tdrawable", "Input drawable", None),
        (PF_STRING, "msg", "Text string", 'Hello, world!')
    ],
    # return vals
    [],
    my_example_plugin_main,  # function name
    menu="<Image>/Filters/Languages/Python-Fu"
)

main()

古い書き方は、7つ目の引数で、メニューの登録位置を記述する。パラメータとして、画像(PF_IMAGE)、レイヤー(PF_DRAWABLE) を書かなくても、メイン処理をする関数が呼ばれた際に、自動でその2つが最初の引数として渡される。

新しい書き方は、一番最後に、メニューの登録位置を記述する。パラメータとして画像とレイヤーも含めておかないと、メイン処理をする関数に、画像、レイヤーが渡されない。

ていうかコレ、以前もハマって、メモしてた…。

_mieki256's diary - 画像を斜めにするGIMP-Pythonスクリプトを書いた
_mieki256's diary - GIMPのPython-fuについてメモ

古い書き方と新しい書き方がある、ということはかろうじて覚えてたけど、パラメータの記述も変わるということをすっかり忘れていた…。

ちなみに前回は以下の記事を読んで解決策が分かった模様。ありがたや。

_【Gimp】Pythonによるプラグイン開発 - プログラマーのメモ書き

#2 [gimp][python] GIMP + Python-Fuでcairoを使って描画するスクリプトの雛形を作成

GIMP + Python-Fu で、cairo(pycairo)を使ってアレコレ描画するスクリプト、の雛形を作成できたので、とりあえずアップロード。あくまで雛形なので、描画内容については全く意味がないソレだけど。

_mieki256/cairo_draw_example.py

gimp_pythonfu_cairo_ss.png

フィルター → Python-Fu → Cairo draw example を選べば、ランダムな位置と色で四角を描きまくる。

以下の環境で動作することを確認済み。
導入の仕方は、 _GIMPにプラグインをインストールする方法 | GIMP2の使い方 という記事が参考になるかと。ちなみに Linux の場合は、~/.gimp-2.8/plug-ins/ の中に該当ファイルをコピーすればOK。だと思う。たぶん。

さて、後は肝心の描画処理を書いていくだけ…。

懸念事項。 :

なんとなく思ったけど、まさか、次期バージョンの GIMP 2.10 では、pycairo が同梱されない状態になったり…しないよな…。

#3 [python] pysdl2をほんの少しだけ試用

Python関係のページをググって眺めてるうちに pysdl2 の単語が目に入って。

アレって今時はどうなってるんだろうと気になり始めたので、せめて導入だけでも試してみようかと。いや、以前も一度試したんですが、面倒臭かった記憶しか…。少しは変わってるのかな…。

ちなみに動作環境は Windows10 x64 + Python 2.7.13。

pysdl2についてざっくり説明。 :

pysdl2 ってのは…。Python で2Dゲームを作れる pygame というライブラリの後継になりそうだったけど今一つなれてないビミョーな扱いを受けてるライブラリで。

昔は「Pythonで2Dゲーム作るならpygame」てな空気があったのだけど。pygame は SDL を使っていて、その SDL は標準状態だとソフトウェアレンダリングだから描画が遅くて。 *1 何せ、全画面書き換えをすると30FPSすら出ないから _「書き換えが必要なところだけ覚えておいてそこだけ書き換えれば速くなるんだぜ! Dirty rectって言うんだぜ!」 てな感じのソレってPC-8801だのFM-7だのWindows3.1時代の話ですかと首を傾げるようなノウハウが公式サイトで語られ続けるほどに今となってはトホホなレベルのライブラリで。

後継ライブラリとして一時期は _pygame2てのが作られていたらしい のだけど。実装しなきゃいけない部分が多岐にわたって作者さんが途中で力尽きて、もうこういう pygame っぽい機能豊富でゴージャスなライブラリは作ってられませんわ開発停止しますわー、となったようで。

その代わり、SDL2の薄いラッパーを目指すぜ、シンプルにするぜ、最低限のことしかしないぜ、やりたいことがあったら自分で頑張って実装してくれよな、と方針が変わって pysdl2 が出てきたのだけど。

薄いラッパーだから、pygame と比べるとユーザ側でやることが増えて使い勝手が悪くなった上に、例えば Windows上で動かす際にはSDL2関係のDLLが必要なのだけど一部のバイナリが配布されてなくて「使いたい人はDLLを自分でビルドしてね」と平然と言われる始末。pygame に比べたら導入すら面倒臭いので、ほとんど誰もあえてわざわざコレを使おうとはしないし誰も使わないからユーザレベルのドキュメントもさっぱり増えないという状況に…。

てな感じの説明で合ってるんですかね? もし間違ってたら誰かツッコミ入れといてください。

pysdl2をインストール。 :

pysdl2自体のインストールは、DOS窓で以下を打つだけ。
pip install pysdl2
すんなりインストールできた。素晴らしい。

が、コレだけでは何もできない。SDL2関連のDLLが別途必要。ここからが…うう…。

SDL2関連のDLLを入手。 :

_Installing PySDL2 - PySDL2 0.9.5 documentation に必要なSDL2関連DLLが列挙されてる。以下から入手できる模様。

_Simple DirectMedia Layer - SDL version 2.0.5 (stable) から、SDL2-2.0.5-win32-*.zip をDL。32bit版と64bit版があるので使いたいほうを。

_SDL_image 2.0 から、SDL2_image-2.0.1-win32-*.zip をDL。

_SDL_mixer 2.0 から、SDL2_mixer-2.0.1-win32-*.zip をDL。

_SDL_ttf 2.0 から、SDL2_ttf-2.0.14-win32-*.zip をDL。

ちとウンザリしてきた…。

しかも、「 _SDL_gfx / SDL2_gfx - ferzkopp.net から SDL2_gfx が入手できるよ」と紹介されてるけど、この SDL2_gfx ってソースしか配布されてなくて。DLL、入ってない。英語圏の掲示板を眺めると、「SDL2_gfx.dll が見つからないんだけど、どこで入手できるの?」という質問に「自分でビルドしろ」と返される光景が何度も出現。pygame使って「ゲームプログラミング、たーのしー!」と思ったであろう初心者達を全力で噛み殺しに来てる…。さすがニシキヘビ…。

そもそもこの SDL2_gfx って、一体何ができるのか、そこからして分からない。オプションと言いつつも、pysdl2 の動作にそこそこ必要になるDLLなの? 別にそれほど必要じゃないの? どっちなの? 正体が分からない。

にしても、いくらなんでも誰もビルドしてないとかあり得ないのでは、とググってたら、 _Windows Binaries - nim-lang/sdl2 Wiki で公開してくれてる方を発見。現行のSDL2は2.0.5だけど、この版は SDL2 2.0.3 なのでちょっぴり古い、けど、手元の環境で試したところ SDL2_gfx.dll 自体は動くようで。ありがたや。

しかしコレ、DLLを入手していくだけでもウンザリするので…。32bit版のDLLを全部まとめて(バックアップも兼ねつつ)こっそりと _ココ に置いときますので面倒臭いなと思った人はどうぞ。「ちょ…おま…ソレ問題あるんじゃねえの?」と不安になった人は各ページを開いてコツコツと一つずつ入手していけば全く同じファイル群が入手できますからどうぞ正規の手順で入手してウンザリして「どこかにまとめて置いとけよ!」と憤っていただければと。自分は憤りました。 *2

DLLを呼び出せるように設定。 :

とりあえず、これで紹介されてるDLL群はあらかた入手できた。zipを解凍して、中に入ってたファイル群をどこか一つのフォルダにまとめて入れておく。重複してるファイルがあったら…タイムスタンプが新しいほうを入れとけばいいんじゃないかな…たぶん…自信無いけど…。

これだけでは、pysdl2 が、各DLLの居場所を知らないままだから呼び出せないので…。OSの環境変数に
PYSDL2_DLL_PATH
を追加して、それらDLLが入ってるフォルダを指定しておく。

環境を汚したくない場合は、DOS窓で
set PYSDL2_DLL_PATH=DLLが入ってるフォルダ
とでも打てば、それ以降は反映されるはず。DOS窓閉じれば設定消えるので次回も設定し直しですが。

あるいは、Pythonスクリプト側に書いていいなら、スクリプトの最初のほうで環境変数を追加すれば済むようで。 _公式ドキュメント でも、「 _os.environ を使えば環境変数を追加した状態にできるよ」と書いてある。

ここまでやれば、ようやく pysdl2 が使える状態に。

サンプルを動かす。 :

pysdl2 がインストールされていれば、Python2.7インストールフォルダ\Lib\site-packages\sdl2\examples\ の中にいくつかサンプルファイルが入ってるので、実行して動作確認ができる。

pong.py と gui.py は、ちょっと注意。例えば、
python pong.py
で動かすと、
> python pong.py
Using software rendering
と表示されて、「ここまで苦労したのに結局ソフトウェアレンダリングかよおお!? 一体何なんだよ、このクソライブラリいい!」と絶望的な気分になるのだけど。

ソースを眺めてみたら、オプションで切り替えられるようで。
> python pong.py -hardware
Using hardware acceleration
ちょっと焦りましたヨ。

たぶん、デフォルトでハードウェアアクセラレーションを有効にしておくと、環境によっては動作しないとかOSが落ちる等の事例があって、故にデフォルトは安全側に振ってあるのですかねえ…。SDLもそうだったし…。たしか昔のIntel製内蔵GPUがヤバかった…ような…。pygame に限らず、SDLを使ってた Ruby/SDL もコレが理由でパフォーマンスが出なかった記憶が…。

ところで、SDL2_gfx って何に使うのか分からなかった件ですが。

gfxdrawing.py を動かしてみたら、どうやら、線や四角や丸を半透明で描画できるDLLのようで。…正直イラネ。こんなもんのために散々ネットサーフィンさせられたのか。ふざけんな。嘘。言い過ぎました。状況によっては便利なDLLなんだろうけど、コレ、スクリーンショットがもうちょっとあれば正体が分かったんでしょうけど、「Graphics drawing primitives and other support functions wrapped up in an add-on」とスクリーンショット2枚だけでは、ちょっと…。もっと凄いブツが描画できる、pysdl2にはほぼ必須のDLLなのかと想像してしまった…。

まあ、現状、ドキュメントの類がほとんど無いから正体が分からないアレコレがあっても仕方ないですな…。

とりあえず、サンプルは動きました、ということで。しかし…相変わらず導入が面倒臭い…。これじゃ流行らないわ…。

余談。 :

_PythonGames - Python Wiki で、Pythonで使えるゲームライブラリが色々紹介されてるのでメモ。

個人的には pyglet に期待してたのですが、アレはOpenGLを使うので、AMD/ATI製GPU上では不具合が出たり *3 、Intel Atom の載ってるPCではスプライトすら出なかったりで。 *4 今はどうなんだろう…。

ググってたら、pygame_sdl2 てのもあるみたいですな。

_renpy/pygame_sdl2: Reimplementation of portions of the pygame API using SDL2.
_Pygame_SDL2 Documentation - pygame_sdl2 latest documentation

しかし、Nightly builds のダウンロード先が404という…。「もうすぐ公式リリースが _PyPI に登録できると思うよ」と書いてあるけど、まだ登録されてないっぽい…。

pygame_sdl2 とは別に、pygame-sdl2 てのもあるようで。これはpysdl2に被せた形っぽい。

_ShadowApex/pygame-sdl2: Drop-in SDL2 implementation of Pygame.

ただ、 _Pygame SDL2 : pygame のやり取りの中で、「pygame_sdl2 が出てきたから、もう pygame-sdl2 は作りません」と pygame-sdl2 の作者さんが書いてますな…。

*1: 「pygameの描画が遅いんですけど…」と質問すると「OpenGLと組み合わせて使え」と言われるのが若干定番な印象。
*2: ていうかホントはコレって pygame 使ってた頃のノリを考えたら pip install pysdl2 をしただけでひとまず全部入る状態が妥当じゃないのかよ何だこの状況てな感じで実は結構ムカムカしてるんですけど。SDL2_gfxのあたりでキレそうになりましたよ。や、ソースを公開してくれてるだけでも大変ありがたいのですが…。しかしpysdl2の使い方を勉強するだけでもこれからユーザに一苦労させるのは間違いないのにソレ以前の導入作業からしてコレでは話にならんだろと。こんなんでpygameの後継ライブラリになるとホントに思ってんのか、これじゃ普及するわけねえだろ何考えてんだ、みたいな。いやまあ、pysdl2 と DLL を分離することでSDL2が更新されるたびに pysdl2 も更新しなきゃみたいな状態を回避できるから負担が減ると踏んでこうしてるのかなと想像するのでそれもそれで分かるのですけど。とは言え開発負荷を下げた結果誰も使えないし使わないライブラリになりましたではそもそも何でコレ作ったのよとなるわけで。さりとて実現不可能な予定を立ててみてもそれもそれでアレですし。実際一回 pygame2 という形でポシャってますから。まあ、色々と難しい…。これではダメだが事情は分かる、事情は分かるんだがこれではダメだろう、みたいな。
*3: _mieki256's diary - pygletがダメなのかと思ったらどうやらRadeonが糞だったらしい話
_mieki256's diary - pyglet + Radeon で描画できない件について
*4: _mieki256's diary - タブレットPCで自作サンプルを動かしてもらった

以上、1 日分です。

過去ログ表示

Prev - 2017/04 - 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

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project