2020年3月22日日曜日

GIMP Script-Py (番外) 画像とレイヤー位置とスクリプト

GIMP の Python で書いていて、ハタと困った事があります。
それは、レイヤー挿入時の位置関係です。
画像サイズに較べて、大きかったり小さかったりするレイヤー。
計算が狂うぅ~。


タカが 1 px の差なのですが、
これって、小さいと思われますか?。

そうです。  1 px で線分を書き込んだのと同じ結果が齎されるのです。
困りますね。

具体的に書きます。
GIMP で、レイヤーサイズが画像サイズに較べて、大きかったり小さかったりすれば、
中央配置にしたいとします。
例えば、GUI からレイヤー追加した時の挙動と同じにしたい訳です。
レイヤーが偶数の数値の場合には問題は起こりません。
割り切れますから。
でも、奇数の場合、2 で割った値を整数にする時に 留意 が必要です。
GUI (全てではありません) は小数点以下の端数を切り捨てています。
レイヤーが大きい場合、これが、悪さをします。

以下に Python Console で例示しましょう。
原因は、Python の知識の無さ! です。
最初が普通に計算したケース、
後半が整数部のみ切り出すケースです。
そして、後半こそが、GIMP GUI レイヤーとして開く での動きになります。
  尤も、整列ではまた異なったロジックの様で、現行では、双方で結果が異なっています。
  C で書かれていると思うのですが、
  推測? Python でなら : -((lyr_size_w - img_size_w) / 2) なのでしょうか?、ね。

GIMP 2.10.18 Python Console
Python 2.7.17 (default, Oct 23 2019, 05:20:31)  [GCC 9.2.0 64 bit (AMD64)]
>>>
>>> img_size_w = 200
>>> lyr_size_w = 200 + 21
>>> offs_w = (img_size_w - lyr_size_w) / 2
>>> img_size_w, lyr_size_w, offs_w
(200, 221, -11)
>>> lyr_size_w = 200 - 21
>>> offs_w = (img_size_w - lyr_size_w) / 2
>>> img_size_w, lyr_size_w, offs_w
(200, 179, 10)
>>>
>>> lyr_size_w = 200 + 21
>>> offs_w2 = int((img_size_w - lyr_size_w) / 2.0)
>>> img_size_w, lyr_size_w, offs_w2
(200, 221, -10)
>>> lyr_size_w = 200 - 21
>>> offs_w2 = int((img_size_w - lyr_size_w) / 2.0)
>>> img_size_w, lyr_size_w, offs_w2
(200, 179, 10)
>>>


でも、どうして、これに拘らなければならないか? ... 。
スクリプトの作業は、GUI での作業と協調して行われます。
  例えば、手作業で加工したレイヤーに、
  スクリプトのレイヤーを重ねて作業する場合等 ... 。
スクリプトの動作は、手作業の動作を模倣しなければなりません。
別動作では困る場合もある訳です。
ですから、挙動が同じで無いと、
最初に書いた 1 px の線が出来て仕舞う! のです。

参考迄に。
レイヤーとして開く と 整列 とで、
結果が異なっていますので、
二者択一が現況ですが、
個人的には、圧倒的に、レイヤーとして開く の方が利用が多いので、こちらに合わせています。



0 件のコメント:

コメントを投稿