#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2026/03/24 20:18:57 +0900> """ 画像を読み込み、ベタデータ(.raw)にして標準出力に送るスクリプト。 gmicで扱える並び、Rチャンネル、Gチャンネル、Bチャンネルの順に並べる。 Google Gemini に作成してもらった。 Usage : python img2raw.py INPUT.png > OUTPUT.raw Windows11 x64 25H2 + Python 3.10.10 64bit + Pillow 11.3.0 """ 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)