2024年4月21日日曜日

GIMP 2.99.19 Python 奮闘記 其の弐 補足 GEGL Color

ふと、気になった事があって、ずっと調べていました。
GIMP 2.99.19 の Python では 色を GEGL Color でハンドリングする事になった訳ですが、
スクリプトから取得した値 が少し変?。
いえいえ、正確なのですが ... 。


最初、スクリプトの実行結果 を眺めてなんか変だなぁ?。
あれぇ、選択した色と結果が異なる気がするなぁ!、と。


実際には、此の様に 表示させる指示 をしたのは自分ですから、
当たり前の結果だった訳で、
此方の 知識不足 が招いた 誤解を与える様な 書き方!、
だった訳です。


少し、書いて見ましょう。

GIMP は 3 の時代に向けて、
色は 全て GEGL (BABL) での扱いになります。
以前から説明されて来た様に、
内部だけでは無く、全面的に採用となる予定でしたね。

色構成値も 色空間 に応じて、
同じ色でも、RGB 構成値 が異なる事は ... 良く知られています。
例えば。
お馴染みの sRGB ですが、
此れは知覚に基づく色空間 でしたね。
より広い色を扱う AdobeRGB も有名ですが、
此れを 其のまま sRGB で表示して仕舞うと 色狂い が生じる、とか。
ガンマ値設定如何で色調が変わる事も知られていますね。
もうひとつは 線形色空間 Linear と呼ばれるもの。
先の 知覚的視覚的な色空間 に対し、
色編集がより正確に行える利点があると説かれます。


では、GIMP の Gegl.Color に戻ります。

Gegl では Linear が基本です。
画面や画像を見ている時は Profile に合わせた 補正後の姿 を見ている訳です。
そして、GIMP (2.99.19) の Python では、
特に何も指定し無い場合、生の値 で 戻り値 が返るのです。
.get_rgba() 。
ですから、 Linear です。

無論、値を指定して色を呼び出す時も同じで、
特に限定し無ければ、
与えた数値は Linear と解釈されます。

其れに対し、
GUI では 今の処 sRGB (Default) での ガンマ補正された値(?) を、
表示しています。
色選択 Dialog も、然り!。

なので。
色空間を明示して呼び出す (get or set) 事で、
狙った値 や 色 を得られる筈ですが、
色空間指定方法 が分からず、難儀しました。

Gegl では無く、Babl での 色空間指定 が 答え! 。


Function > Babl > format
Ref: https://developer.gimp.org/api/babl/func.format.html
Description

Returns the babl object representing the color format given by name such as for example “RGB u8”, “CMYK float” or “CIE Lab u16”, creates a format using the sRGB space, to also specify the color space and TRCs for a format, see babl_format_with_space.

実際の Python Code
r_v, b_v, g_v は 0.0 ~ 1.0 の値

.get_rgba_with_space(Babl.format("R'G'B' u8"))
.set_rgba_with_space(Babl.format(r_v, b_v, g_v, "R'G'B' u8"))


Dialog の初期値の場合、
ユーザーが値を選ぶのが前提の為、初期の色が多少狂っても問題無い筈ですが、
Code の中で 直接 色指定する場合には、上記の件を留意し無いと、
困った事になるかも。
そう、 微妙に色が違う~、なんて、呟か無い様に、ね。
はい。


参考。
Console での 実行例 を。  其の前に、GUI で色設定。

-----------------
Set Context Foreground HTML#bbbbbb (R:0.733, G:0.733, B:0.733) By Using GUI
-----------------

GIMP 2.99.19 Python Console
Python 3.11.8 (main, Feb 13 2024, 07:18:33)  [GCC Clang 17.0.6 64 bit (AMD64)]
>>> import gi
>>> gi.require_version('Gimp', '3.0')
>>> from gi.repository import Gimp
>>> gi.require_version('GimpUi', '3.0')
>>> from gi.repository import GimpUi
>>> gi.require_version('Gegl', '0.4')
>>> from gi.repository import Gegl
>>> from gi.repository import GObject
>>> from gi.repository import GLib
>>> from gi.repository import Gio
>>>
>>> fg_color=Gimp.context_get_foreground()
>>> fg_color.get_rgba()
(red=0.4969337582588196, green=0.4969337582588196, blue=0.4969337582588196, alpha=1.0)
>>>
>>> fg_color.get_rgba_with_space(Babl.format("R'G'B' u8"))
(red=0.7333340644836426, green=0.7333340644836426, blue=0.7333340644836426, alpha=1.0)
>>>
  
因みに、色指定は こんな書き方 (HTML#) も OK ですね。
  方法に依って、戻って来る値に まるめ誤差 がありそうですが ... 。
  複数の環境下からコピペしてますが、微妙に ... 。
  実数(浮動小数点数)ですからね、 う~ん ... 。
  有効桁数で考えるのでしょうが、 頭 ... パンク。

>>> color=Gegl.Color.new("#bbbbbb")
>>> color
<Gegl.Color object at 0x00000229a650dd40 (GeglColor at 0x00000229a6038a20)>
>>> color.get_rgba_with_space(Babl.format("R'G'B' u8"))
(red=0.7333333492279053, green=0.7333333492279053, blue=0.7333333492279053, alpha=1.0)
>>>
>>> 0.7333333492279053*256
187.73333740234375
>>> 0.7333333492279053*255
187.00000405311584
>>> 0.7333333492279053*(256-1)
187.00000405311584
>>>
>>> int(0.7333333492279053*(256-1))
187
>>> round(0.7333333492279053*(256-1))
187



0 件のコメント:

コメントを投稿