省型旧形国電の残影を求めて

戦前型旧形国電および鉄道と変褪色フィルム写真を中心とした写真補正編集の話題を扱います。他のサイトでは得られない、筆者独自開発の写真補正ツールや補正技法についても情報提供しています。写真補正技法への質問はコメント欄へどうぞ

GIMP / Python プログラミング

GIMP3 / Python プログラミング試行錯誤日誌: マスクを削除しても、マスクがあるというフラグのまま?

この問題は解決まで数時間かかりましたので、ちょっとメモをしておきます。 やろうと思ったことは、あるレイヤーから既存のマスクを一旦削除して、別のレイヤーのマスクをコピーして、削除したレイヤーの代わりに、コピーしたマスクを追加しようとしました。…

Kubuntu (Ubuntu 系システム) 上で Python に pip でライブラリをインストールした場合、どこにインストールされるか?

Linux の場合、pip でなにかライブラリーをインストールしようとすると次のようなエラーメッセージが出て、インストールできません。 システムインストールした Python に numpy をインストールしようとすると... 基本的にオプションのライブラリはシステム…

GIMP3 / Python プログラミング試行錯誤日誌: 個人設定ディレクトリを取得しようとすると Flatpak に落とし穴がある

GIMP プラグインのプログラミングをやっていて、いまプラグインがあるディレクトリを取得したい場合があります。この場合、Python の標準ライブラリ os にある、os.path.dirname(__file__) メソッドを入れると、今走らせているプラグインがあるディレクトリ…

GIMP3 / Python プログラミング試行錯誤日誌: 改行コード \n が効かない

GIMP プラグインの UI プログラミングを行なっていて、ダイアログ上のラベルで、途中で改行折り返し表示をさせようと思いました。この場合通常は以下のように行います。 strings = "message \n displayed." label = Gtk.Label(label=strings) 上の場合、あら…

Flatpak インストールされた GIMP3 の Python-fu で動いている Python インタープリタはどこに?

GIMP3 で動く Python3 プラグインを作成するのに、オプションのライブラリが使えるかどうか、という問題があります。例えば numpy などは使いたい場合が多いのではないでしょうか? そもそも Unix 系ではシステムインストールされている Python にオプション…

GIMP3 / Python プログラミング試行錯誤日誌: どうやって GIMP の UI 言語を取得するか?

前回、自作プラグインを国際化するためにもうちょっと簡単な方法はないかという話を書きました。そのためには、GIMP の UI 言語を取得しなければなりません。しかし、GIMP の UI 言語を直接取得する API が見つかりません。 どうも、GIMP の OS ライブラリを…

GIMP3 / Python プログラミング試行錯誤日誌: Python プラグインを国際化する方法は?

現在までに公表されている、GIMP3 用 Python スクリプト作成ガイドには、スクリプトの国際化 (多言語対応) については、ほぼ何も言及されていません。 ただ、 国際化するなら、def do_set_i18n (self, name) というユーザ定義関数を用意しておいてね、という…

GIMP3 / Python プログラミング試行錯誤日誌: GIMP3 で選択されたレイヤーをどう確認するか?

GIMP 2.10 時代に、今選択されているレイヤーを取得する API コマンドとして、 pdb.gimp_image_get_active_layer() というものがありました。ところが、GIMP3 では、レファレンスで、Gimp.Image を見てもそれっぽいものが見当たりません。 lazka.github.io …

知覚的色空間 vs. リニア色空間

ここのところ私が作成した GIMP のプラグインの解説で知覚的色空間とリニア色空間という用語が出てきます。詳しい話は下記の記事を見ていただきたいのですが... yasuo-ssi.hatenablog.com ここでは簡単に説明を行っておきます。 まず、人間の視覚は物理的な…

GIMP3 / Python プログラミング試行錯誤日誌: curves_spline メソッドと色ずれ問題

先日書いたように、GIMP プラグインプログラミングで画像のピクセル値を操作するには、基本的には、Gimp.Drawable.curves_spline() メソッドを使うようです。 yasuo-ssi.hatenablog.com で、この間シグモイド・カーブ プラグインを書いていて気になることが…

GIMP3 / Python サンプルプログラム: UI 上で cairo を使ってグラフを描く

このサンプルプログラムは UI 上で与えたパラメータに応じて、UI (ダイアログ) 上にグラフを書くものです。cairo という2次元のベクトル画像を描く Gtk のライブラリを使っています。 サンプルプログラムのダウンロードはこちらから。 このサンプルプログラ…

GIMP3 / Python サンプルプログラム: 対話型 (インターアクティブ) スライダー

GIMP3 の Python UI プログラミング サンプルファイルの第3弾です。今回はスライダーですが、単なるスライダーではありません。インターアクティブ (対話型、相互作用型) に動くスライダーで、ちょっと高度です。 インターアクティブとは、UI を動かすとその…

GIMP3 / Python プログラミング試行錯誤日誌: Python でピクセル値を計算する際の色空間に関する注意点

今回は GIMP3 上でピクセル値計算処理を行う場合に非常に重要な問題を扱います。 以前に書いたように、GIMP で基本的に計算が行われる色空間はリニア RGB です。 yasuo-ssi.hatenablog.com しかし、UI 上での表示は TRC がかかった知覚的 RGB (sRGB)となって…

GIMP3 / Python サンプルプログラム: 画像計算機

今回GIMP3 / Python プラグインのサンプルプログラムとして、画像計算機 (image arithmetic) を作成してみました。以前書きましたが、GIMP で画像の数値計算を行う場合、基本的には Gimp.Drawable の curves_spline メソッドを使うようです。 yasuo-ssi.hate…

GIMP3 / Python サンプルプログラム: コンボボックス UI

GIMP3 の Python UI プログラミング サンプルファイルの第2弾です。今回はコンボボックスです。テキストボックス風ですが、右端をクリックすると、下に下がった選択肢を表示しその中から選べるようにする UI です。 ダウンロードはこちらから。 このサンプル…

GIMP3 / Python サンプルプログラム: テキストボックス UI

GIMP3 になって Python プログラミングの方法が大きく変わっています。特に、UI の作り方が大幅に変わっており、UI を作る自由度は上がっているのですが、一方で非常に複雑化しています。多分ここで戸惑う方は非常に多いのではないかと思います。 そのためプ…

GIMP3 / Python プログラミング試行錯誤日誌: GIMPにおけるレイヤー操作

今回、相対 RGB 色マスク作成ツール GIMP3 プラグイン版を公開しましたが、非破壊編集が使えないので、その代わりに色々レイヤー操作を行う必要が出てきました。ここで Python を使ったレイヤー操作の基本についてまとめておきたいと思います。 ・何らかの方…

GIMP3 / Python プログラミング試行錯誤日誌: GIMP上でピクセル値計算をどうやるか?

GIMP プラグイン開発のためプログラムを書いていて、ピクセルの値を操作したい場合があります。そのような場合どうすればよいのでしょうか? まず端的に Gimp.Drawable に set_pixel というメソッドがあります。 -------------------- set_pixel(x_coord, y_…

GIMP3 / Python プログラミング Tips: 実行を一時止めるデバッグ用メッセージボックス

GIMP の Python プラグインを開発する際に、プログラムの実行を一時止めるプログラムを考えました。 以下のコードをコピーして、gimp_debug.py という名前で保存します。 -------------- #!/usr/bin/env python3 import gi gi.require_version('Gimp', '3.0'…

GIMP3 / Python プログラミング試行錯誤日誌: レイヤーの順番変更と順番変更後の注意

GIMP のプログラミングにおいて、レイヤーの順番を変更したい場合があります。この場合はどうしたら良いのでしょうか? 今、image という名のイメージオブジェクトがあり、その中に含まれるレイヤーを以下のコマンドで取得したとします。 layers = image.get_…

GIMP3 / Python プログラミング試行錯誤日誌: gimp:threshold の情報はどこにあるか?

gimp3 で新設された (?)、GIMP 特有の非破壊フィルターの情報に関するドキュメントは一切ないようなので、どうやらそれに関する情報を得るにはソースコードを見るしかないようです。そこで、先日の gimp:threshold のソースコードはどこにあるのかを探してみ…

GIMP3 / Python プログラミング試行錯誤日誌: しきい値ツールを Python 上から非破壊的に適用できるフィルターを探す

GIMP のメニューに [しきい値] というフィルターモジュールがあります。 しきい値モジュール このフィルターは以下にあるように一定の閾値で画像を黒と白に転換するモジュールです。 しきい値モジュールを適用した結果 これを適用すると、以下のレイヤーダイ…

GIMP3 / Python プログラミング Tips: Gegl フィルターブラウザを有効にする

先日 Gegl オペレーションの一覧について記事を書きましたが、GIMP3 の UI 上から Gegl フィルターブラウザを使えるようにすることを教えてもらいました。 このツールは、Kamil Burda さんという方が作成した Batcher というプラグインを導入すると使えるよ…

GIMP3 / Python プログラミング試行錯誤日誌: Chat GPT はどこまで GIMP3 プログラミングの助けになるか

Chat GPTなどの生成 AI のプログラミングへの有用性が指摘されています。この手の AI ツール あまり信用していないのですが、しかし、GIMP3 用のプログラミングに苦しむ中で、活用を考えざるを得ません。 使ってみた結果ですが、既存のソースコードを解読す…

GIMP3 / Python プログラミング試行錯誤日誌: Gtk.Dialog を使ってダイアログボックスを作成する

ようやく GIMP3 の Python プログラミングの要領が少しずつ分かってきましたが、今のところ本格的なダイアログボックスの作成についてちゃんと理解できていません。2.10 の gimp-fu 依存時代は、Register 関数で簡単に (ただしあまり凝ったことはできません…

GIMP3 / Python プログラミング Tips: Gegl オペレーションの一覧

先日 Chuck Henrich 氏が作成した GIMP3 用 Python プラグインのコードの解読を試みましたが、その中でガウスぼかしを実行する GEGL フィルターを使っていました。 この GEGL フィルターにはどんなものがあるのか、その一覧は下記に掲載されていました。 geg…

GIMP3 / Python プログラミング試行錯誤日誌: frequency-separation-group-v3 UI コードの解読

ハンガリーの Chuck Henrich 氏による GIMP 用 Python プラグイン: Frequency separation plug-in の GIMP3 版が公開されています。 discuss.pixls.us このプラグインは、元の画像からテクスチャー部分と、カラー & トーン部分を分離してレイヤーグループに…

GIMP3 / Python プログラミング試行錯誤日誌: UI を作る際のチュートリアル & レファレンスサイト

何とか、ある程度 GIMP3 用プラグインを Python で書けるようになりましたが、まだよく分かっていないのが ダイアログなどの UI (GUI) をどの様に作ったら良いのかということです。 一応、Gimp Developers サイトには、C で UI を書く方法は載っているのです…

GIMP3 / Python プログラミング Tips: Akkana Peck 氏の PDB 呼び出しを簡単にする Gimp helpers

先日の記事で、GIMP3 の Python プログラミングにおいて、PDB Pricedure の呼び出しはできないことはないが、コードが面倒になるという話を書きました。 それですが、"Beginning GIMP: From Novice to Professional" の著者の Akkana Peck 氏の GIMP3 用 Pyt…

GIMP3 / Python プログラミング試行錯誤日誌: Gegl.color 値はどうやって指定するか

GIMP3 の Python プログラミングについてですが、色指定をする場合、2.10 では基本的に 8 bit の RGB 値で指定することが多かったと思います。例えば (255, 255, 255) というような形です。ところでは 3.0 では原則、Gegl.color 値で指定することになったよ…