2016年1月8日金曜日

GIMP Script-Fu (6) レイヤーから画像サイズ変更を

画像(キャンバス)サイズの変更は、そう、出番があるとは思えません。
標準機能で、すべてのレイヤーを内包するサイズへは簡単に変更出来ます。
しかし、特定のレイヤーに合わせたサイズにしようと思うと、これが、結構、手間です。
必要は発明の母。  作りましたよ。  Script-Fu で。


私が GIMP を使う場合、大抵は、画像(キャンバス)サイズが事前に決まっています。
でも、不特定の画像をレイヤーで取り込んだり、キャンバスより広大なレイヤーを操作する場合、
そのレイヤーの全域が見渡せた方が作業は楽です。
或いは、ひとつの画像から別サイズ画像(複数レイヤー)を切り出し 別名保存したい場合 等もキャンバスサイズを弄りたくなります。
例えば、 縦横共用のポストカードの雛形とか、 GIF アニメ用の動かす前提の大きなレイヤーを含む画像とか です。
標準では簡便ではないのですよね。  私が知らないだけで簡単な手順があるのかもですが ... 。


冒頭に書いた様に、
キャンバスサイズの変更として、コーディングする方法 もありましたが、
その前の段階である レイヤー情報を基に選択範囲を自動生成 と言う形で実装しました。
然したる確証がある訳ではないのですが、 勘です。  勘。. *1.
を採りました。 *1.


ユーザーサイドから考えた場合、 この様な スクリプト ではパラメータは必要ありません。
選ばれている(活性化)レイヤーを対象にするだけです。
従って、 スクリプトに付きものの 数値操作画面 は ありません。


最初の目論見 (選択しているレイヤーにキャンバスサイズを合わせる) を実現するには、
  1. 自作 Script 実行
  2. 画像(I) > キャンバスを選択範囲に合わせる(I) 実行
と言う手順を踏む事になります。
謂わば、ワンクッション入る形 ですね。 *1.

スクリプトを実行すると、現在選択されている活性レイヤーと 同じ位置 同じ大きさ の 選択範囲を作ります 画像に変更します。 *1.


Script-Fu に慣れていないので、ゴリゴリのコードですが、一応、載せて置きます。  問題発覚!。 駄目です、これ。 更新。 *1.
最初ちゃんと動かなかったので、備忘録的に、訂正する前のコードとコメントも残してあります。.


スクリプト名: Shiro-Layer-To-Resize-Image.scm  *1.
登録関数名: script-fu-shiro-from-layer-to-resize-image  *1.


;
; ---------------------------------------------- version 1.1 2015/12/25
; ---------------------------------------------- version 1.2 2015/12/26
; ---------------------------------------------- version 1.3 2016/01/12
; ---------------------------------------------- version 1.3 2019/07/04 Menu for GIMP 3.0
;
(define (script-fu-shiro-from-layer-to-resize-image
  ;引数
 img
 layer1
          )

  ;処理
    (gimp-image-undo-group-start img)

   (gimp-image-resize-to-layers img)
    ;                    Before Resize, Select All Layers

    (let ((width 0) (height 0) (leftTop_x 0) (leftTop_y 0) )

        (set! layer1 (car (gimp-image-get-active-layer img)) )
        (set! width (car (gimp-drawable-width layer1)) )
        (set! height (car (gimp-drawable-height layer1)) )
        (set! leftTop_x (car (gimp-drawable-offsets layer1)) )
        (set! leftTop_y (cadr (gimp-drawable-offsets layer1)) )

        ;(gimp-rect-select img leftTop_x leftTop_y width height 0 0 0)
        ;                            Add Selection    ;Deprecated
        ;                            Use 'gimp-image-select-rectangle' instead. (pdb)

        ;(gimp-image-select-rectangle img 2 leftTop_x leftTop_y width height)
        ;                            2nd parameter Int32
        ;                                 0(Add追加)  1(Subtract減算)  2(Replace置換)  3(Intersect交差)

      (gimp-image-resize img width height (- leftTop_x) (- leftTop_y))
    )

    (gimp-image-undo-group-end img)
    (gimp-displays-flush)

)


;登録

(script-fu-register
  "script-fu-shiro-from-layer-to-resize-image"            ;func name  v1.3

;  "レイヤーから選択範囲  (Shiro版)"            ;X menu label (X v1.2)
;  "Create selection from layer (ShiroV.)"    ;X menu label(Eng) (X v1.2)
;  "レイヤーから選択範囲を作成"                            ;X description (X v1.2)
;  "Create a selection from a layer"                    ;X description(Eng) (X v1.2)

  "レイヤーから画像リサイズ  (Shiro版)"                    ;menu label (v1.3)
;  "Resize Image from layer (ShiroV.)"                   ;menu label(Eng) (v1.3)
  "活性レイヤーから画像をリサイズ調整します v1.3"       ;description (v1.3)
;  "Resize(Adjust) Image from the active layer  v1.3"     ;description(Eng) (v1.3)
  "ShiroYuki_Mot"                                                ;author
  "(c) 2015- ShiroYuki_Mot"                                ;copyright notice
  "2015/12/24"                                                    ;date created
  "*"                                                                ;image type on the script

  ;パラメータ
 SF-IMAGE    "Image"    0
 SF-DRAWABLE "Drawable" 0

)
(script-fu-menu-register "script-fu-shiro-from-layer-to-resize-image"
                         "<Image>/Image")

ダウンロード用として、別 Blog に専用ページを設けました。  コードに問題発覚!。. *1.更新  *2.

 DownLoad Page > GIMP Script-Fu Shiro-Layer-To-Resize-Image  *2.


そうそう、断って置きます。
メニューでのスクリプトの場所は 画像(I) の下にしてあります。  *1.



追記:  *2.
    当初の 選択範囲を作る 事を諦め、 最終目的の 画像変更迄 としました。
    選択範囲のままでは、 スクリプト実行直後に、
    画像サイズが全レイヤーを内包するサイズに変更されたままですので、
    気付かずに、そのまま画像サイズを変更せずに保存した場合、
    意に反したものが保存されてしまう のでは と考えました。
    その為、名称や内容が大きく異なってしまい、 投稿として、見辛いとは思いますが、 ご勘弁下さい。



[2016/01/12] 問題発覚の為、リンク休止 目下、修正中。
[2016/01/13] コード暫定公開  *1.  もう少し Debug してから、ファイル再公開にします。.
[2016/01/16] ファイルへの専用ページ リンク再開 及び 追記 追補  *2.  きっと、大丈夫かと。.
[2016/01/19] 取り消し線 部分の文章の色を薄い灰色へ
[2019/07/05] GIMP 3.0 で (script-fu-register ... ) がメニューパス付を受け付けない事を反映
                          ソースコード部分を入れ替え  後日、リンク先も訂正予定

2 件のコメント:

  1. ご覧の皆さま へ。

    大幅に、修正する事になってしまいました。
    タイトルも スクリプト名も 関数名も 内容も 変わっています。
    当初の やりたい事 は変わらないので、そのまま、訂正の上、公開としました。
    訂正だらけで、見辛い投稿になっていますが、御了承下さい。
    尚、ファイル公開は、もう少し、運用 Debug してからと させて戴きます。  目標。今週末。

    返信削除
    返信
    1. 追記
      恐らく、大丈夫そうなので、 ファイル公開ページへのリンクを再開しました。

      削除