2026/03/24(火) [n年前の日記]
#3 [gmic][python] rawデータに変換してgmicに渡して処理をさせる
画像を読み込んで、gmic用rawデータの並びに変換して、標準出力に送るPythonスクリプトを、AI(Google Gemini)に作成してもらった。これを使って gmic の標準入力に画像データを渡して処理ができるか確認したい。
環境は Windows11 x64 25H2 + Python 3.10.10 64bit + Pillow 11.3.0。
_img2raw.py
使い方は以下。
rawデータは、画像サイズ、枚数、チャンネル数などの情報を持っていないので、それらの情報は別途指定して読み込む必要がある。
環境は Windows11 x64 25H2 + Python 3.10.10 64bit + Pillow 11.3.0。
_img2raw.py
import sys
import argparse
from PIL import Image
# 画像を読み込み、指定された形式のRAWデータとして標準出力に送る
def image_to_raw(image_path, interleaved=False):
try:
with Image.open(image_path) as img:
# アルファチャンネルの有無を判定して適切なモードへ変換
if "A" in img.getbands():
img = img.convert("RGBA")
else:
img = img.convert("RGB")
if interleaved:
# ピクセル並びをインターリーブ形式(RGBRGB... / RGBARGBArgba...)にする
# tobytes() は Pillow のメモリレイアウト(インターリーブ)をそのまま返す
sys.stdout.buffer.write(img.tobytes())
else:
# プレーンごとに並べる Planar形式 (RRR...GGG...BBB...)
# split() で各チャンネルに分離して順番に書き出す
channels = img.split()
for channel in channels:
sys.stdout.buffer.write(channel.tobytes())
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Convert image to RAW data and send to stdout."
)
parser.add_argument("input", help="Input image file path.")
parser.add_argument(
"-i",
"--interleaved",
action="store_true",
help="Output in interleaved format (RGBRGB... / RGBARGBArgba...).",
)
args = parser.parse_args()
image_to_raw(args.input, interleaved=args.interleaved)
使い方は以下。
python img2raw.py lena.png > out.raw py img2raw.py lena.png | gmic i -.raw,uint8,512,512,1,3 blur 10.0 o -.png > out.png py img2raw.py lena.png | gmic input -.raw,uint8,512,512,1,3 blur 10.0 output -.png > out.png py img2raw.py -i lena.png | convert -depth 8 -size 512x512 rgb:- png:- > out.png
rawデータは、画像サイズ、枚数、チャンネル数などの情報を持っていないので、それらの情報は別途指定して読み込む必要がある。
[ ツッコむ ]
以上です。