GIMPのPythonスクリプトで画像生成：初心者向け完全ガイド

## はじめに

GIMPは強力な画像編集ソフトウェアですが、Pythonスクリプトを使用することで、その機能をさらに拡張できます。本記事では、GIMPのPythonスクリプトを使って、カスタムメッセージを含む画像を自動生成する方法を解説します。

このガイドは、プログラミング初心者でも理解できるよう、ステップバイステップで説明していきます。


## デモ動画

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">ComfyUIとGIMPを連携させるための下準備①<br>まずはGIMPをPythonスクリプトを実行して文字を入れる簡単な操作してみた！<br>これは面白い！！ <a href="https://t.co/fEneI9S1LX">https://t.co/fEneI9S1LX</a> <a href="https://t.co/B9ft4zp0BX">pic.twitter.com/B9ft4zp0BX</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1813865874044125351?ref_src=twsrc%5Etfw">July 18, 2024</a></blockquote>

## GIMPとPythonスクリプトの基礎

GIMPでPythonスクリプトを使用すると、画像処理を自動化できます。以下は、GIMPとPythonスクリプトの関係を示す簡単な図です。

```mermaid
%%{init: {"themeVariables": { "primaryColor": "#ffcccc", "secondaryColor": "#ccffcc", "tertiaryColor": "#ccccff", "mainBkg": "#fff0f0", "nodeBorder": "#ff9999", "clusterBkg": "#fffaf0", "clusterBorder": "#ffe4b5", "lineColor": "#ff9999", "fontFamily": "arial"}}}%%
graph TD
    A[GIMP] --> B[Python-Fu]
    B --> C[Pythonスクリプト]
    C --> D[自動化された画像処理]
    D --> E[生成された画像]
```

- **GIMP**: 画像編集ソフトウェア
- **Python-Fu**: GIMPとPythonを繋ぐインターフェース
- **Pythonスクリプト**: 自動化のための命令セット
- **自動化された画像処理**: スクリプトによる画像操作
- **生成された画像**: 処理結果の出力

## スクリプトの全体構造

まず、スクリプト全体の構造を理解しましょう。

```mermaid
%%{init: {"themeVariables": { "primaryColor": "#ffcccc", "secondaryColor": "#ccffcc", "tertiaryColor": "#ccccff", "mainBkg": "#fff0f0", "nodeBorder": "#ff9999", "clusterBkg": "#fffaf0", "clusterBorder": "#ffe4b5", "lineColor": "#ff9999", "fontFamily": "arial"}}}%%
graph TD
    A[スクリプト開始] --> B[ライブラリのインポート]
    B --> C[main関数の定義]
    C --> D[キャンバス作成]
    D --> E[テキスト追加]
    E --> F[画像保存]
    F --> G[スクリプト登録]
    G --> H[スクリプト終了]
```

1. **ライブラリのインポート**: 必要な機能を読み込みます。
2. **main関数の定義**: 主要な処理を行う関数を定義します。
3. **キャンバス作成**: 新しい画像を作成します。
4. **テキスト追加**: メッセージをキャンバスに追加します。
5. **画像保存**: 生成した画像を保存します。
6. **スクリプト登録**: GIMPのメニューにスクリプトを登録します。

それでは、各部分を詳しく見ていきましょう。

## キャンバスの作成

まず、新しいキャンバスを作成します。

```python
width = 1000
height = 600
bg_color = (255, 255, 255)  # 白色

image = gimp.Image(width, height, RGB)
background = gimp.Layer(image, "Background", width, height, RGB_IMAGE, 100, NORMAL_MODE)
image.add_layer(background, 0)

gimp.set_background(bg_color)
background.fill(BACKGROUND_FILL)
```

このコードは以下のことを行っています：

1. キャンバスのサイズ（幅1000px、高さ600px）を設定
2. 背景色を白に設定
3. 新しい画像を作成
4. 背景レイヤーを追加
5. 背景を白で塗りつぶす

```mermaid
%%{init: {"themeVariables": { "primaryColor": "#ffcccc", "secondaryColor": "#ccffcc", "tertiaryColor": "#ccccff", "mainBkg": "#fff0f0", "nodeBorder": "#ff9999", "clusterBkg": "#fffaf0", "clusterBorder": "#ffe4b5", "lineColor": "#ff9999", "fontFamily": "arial"}}}%%
graph TD
    A[キャンバス作成開始] --> B[サイズと色の設定]
    B --> C[新しい画像作成]
    C --> D[背景レイヤー追加]
    D --> E[背景色で塗りつぶし]
    E --> F[キャンバス作成完了]
```

## テキストの追加

次に、キャンバスにテキストを追加します。

```python
message = "!! Hello from GIMP Python !!"
font_size = 50
font_color = (255, 0, 0)  # 赤色

gimp.set_foreground(font_color)

text_layer = pdb.gimp_text_layer_new(image, message, "BIZ UDMincho Medium", font_size, 0)
image.add_layer(text_layer, 0)

pdb.gimp_text_layer_set_justification(text_layer, 2)  # CENTER_JUSTIFY
text_layer.set_offsets(
    (width - text_layer.width) // 2,
    (height - text_layer.height) // 2
)
```

このコードの流れは以下のとおりです：

1. メッセージ、フォントサイズ、色を設定
2. テキストレイヤーを作成
3. テキストを中央揃えに設定
4. テキストをキャンバスの中央に配置

```mermaid
%%{init: {"themeVariables": { "primaryColor": "#ffcccc", "secondaryColor": "#ccffcc", "tertiaryColor": "#ccccff", "mainBkg": "#fff0f0", "nodeBorder": "#ff9999", "clusterBkg": "#fffaf0", "clusterBorder": "#ffe4b5", "lineColor": "#ff9999", "fontFamily": "arial"}}}%%
graph TD
    A[テキスト追加開始] --> B[テキスト設定]
    B --> C[テキストレイヤー作成]
    C --> D[レイヤーを画像に追加]
    D --> E[テキストを中央揃え]
    E --> F[テキストを中央配置]
    F --> G[テキスト追加完了]
```

## 画像の保存

生成した画像を保存します。

```python
output_dir = gimp.directory
filename = "generated_message0.png"
fullpath = os.path.join(output_dir, filename)

merged_layer = pdb.gimp_image_merge_visible_layers(image, CLIP_TO_IMAGE)

pdb.file_png_save(image, merged_layer, fullpath, filename, 0, 9, 0, 0, 0, 0, 0)

gimp.message("Image saved to: " + fullpath)
```

保存プロセスは以下のとおりです：

1. 保存先ディレクトリとファイル名を設定
2. レイヤーを結合
3. PNG形式で保存
4. 保存場所をメッセージで表示

```mermaid
%%{init: {"themeVariables": { "primaryColor": "#ffcccc", "secondaryColor": "#ccffcc", "tertiaryColor": "#ccccff", "mainBkg": "#fff0f0", "nodeBorder": "#ff9999", "clusterBkg": "#fffaf0", "clusterBorder": "#ffe4b5", "lineColor": "#ff9999", "fontFamily": "arial"}}}%%
graph TD
    A[保存プロセス開始] --> B[保存先設定]
    B --> C[レイヤー結合]
    C --> D[PNG形式で保存]
    D --> E[保存場所表示]
    E --> F[保存プロセス完了]
```

## スクリプトの登録と実行

最後に、スクリプトをGIMPに登録します。

```python
register(
    "python_fu_create_canvas_with_message0",
    "Create new canvas with message and save",
    "Creates a new canvas, adds a predefined message to it, and saves the image",
    "am(author)",
    "am(copyright)",
    "2024/07/18",
    "Canvas with Message (Save)",
    "",
    [],
    [],
    plugin_main,
    menu="<Image>/File/Create/"
)

main()
```

この部分で以下のことを行っています：

1. スクリプトの名前と説明を設定
2. 著作権情報を追加
3. GIMPのメニューにスクリプトを登録
4. スクリプトのメイン関数を指定

```mermaid
%%{init: {"themeVariables": { "primaryColor": "#ffcccc", "secondaryColor": "#ccffcc", "tertiaryColor": "#ccccff", "mainBkg": "#fff0f0", "nodeBorder": "#ff9999", "clusterBkg": "#fffaf0", "clusterBorder": "#ffe4b5", "lineColor": "#ff9999", "fontFamily": "arial"}}}%%
graph TD
    A[登録プロセス開始] --> B[スクリプト情報設定]
    B --> C[著作権情報追加]
    C --> D[メニューに登録]
    D --> E[メイン関数指定]
    E --> F[登録プロセス完了]
```

## 全体コード

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import *
import os

def plugin_main():
    # キャンバスのサイズと色を定義
    width = 1000
    height = 600
    bg_color = (255, 255, 255)  # 白色

    # スクリプト内で定義されたメッセージ
    message = "!! Hello from GIMP Python !!"
    font_size = 50
    font_color = (255, 0, 0)  # 赤色

    # 新しい画像を作成
    image = gimp.Image(width, height, RGB)
    
    # 背景レイヤーを追加
    background = gimp.Layer(image, "Background", width, height, RGB_IMAGE, 100, NORMAL_MODE)
    image.add_layer(background, 0)
    
    # 背景色で塗りつぶす
    gimp.set_background(bg_color)
    background.fill(BACKGROUND_FILL)

    # 現在のフォアグラウンドカラーを保存
    old_fg = gimp.get_foreground()
    
    # フォアグラウンドカラーを設定
    gimp.set_foreground(font_color)
    
    # 新しいテキストレイヤーを作成
    text_layer = pdb.gimp_text_layer_new(image, message, "BIZ UDMincho Medium", font_size, 0)
    
    # テキストレイヤーを画像に追加
    image.add_layer(text_layer, 0)
    
    # テキストレイヤーを画像の中央に配置
    pdb.gimp_text_layer_set_justification(text_layer, 2)  # CENTER_JUSTIFY
    text_layer.set_offsets(
        (width - text_layer.width) // 2,
        (height - text_layer.height) // 2
    )
    
    # フォアグラウンドカラーを元に戻す
    gimp.set_foreground(old_fg)
    
    # 画像を保存
    output_dir = gimp.directory  # GIMPのデフォルトディレクトリ
    filename = "generated_message0.png"
    fullpath = os.path.join(output_dir, filename)
    
    # レイヤーを結合
    merged_layer = pdb.gimp_image_merge_visible_layers(image, CLIP_TO_IMAGE)
    
    # 画像を保存
    pdb.file_png_save(image, merged_layer, fullpath, filename, 0, 9, 0, 0, 0, 0, 0)
    
    # 保存場所をコンソールに出力
    gimp.message("Image saved to: " + fullpath)
    
    # 新しい画像を表示（CLIモードでは表示されません）
    gimp.Display(image)
    
    # 画像を更新
    gimp.displays_flush()

register(
    "python_fu_create_canvas_with_message0",
    "Create new canvas with message and save",
    "Creates a new canvas, adds a predefined message to it, and saves the image",
    "am(author)",
    "am(copyright)",
    "2024/07/18",
    "Canvas with Message (Save)",
    "",
    [],
    [],
    plugin_main,
    menu="<Image>/File/Create/"
)

main()

```

## まとめ

このPythonスクリプトを使用することで、GIMPで以下の操作を自動化できます：

1. 新しいキャンバスの作成
2. カスタムメッセージの追加
3. 画像の保存

初心者の方でも、このガイドを参考にしながらスクリプトを理解し、自分のニーズに合わせてカスタマイズすることができます。GIMPとPythonの組み合わせは、画像処理の可能性を大きく広げてくれます。

スクリプトを修正して、異なるサイズ、色、フォント、メッセージを試してみてください。GIMPのPythonスクリプティングの世界を探索し、あなたの創造性を解き放ちましょう！

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>