#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2026/03/22 16:37:40 +0900> """ 共有メモリを使って親スクリプトから画像データを受け取り処理する子スクリプト Windows11 x64 25H2 + Python 3.10.10 64bit """ import sys import struct from multiprocessing import shared_memory def process_shm_simple(): # 1. 親からメモリ名と画像サイズを受信 (計72byte) # メモリ名(64byte) + 幅(4byte) + 高さ(4byte) header = sys.stdin.buffer.read(72) if len(header) < 72: return shm_name_raw, width, height = struct.unpack("64sii", header) shm_name = shm_name_raw.decode().strip("\x00") # 2. 既存の共有メモリに接続 try: shm = shared_memory.SharedMemory(name=shm_name) data = shm.buf # 3. 画像処理(グレースケール化) # メモリを直接書き換えるため、戻り値を stdout で送る必要がありません for y in range(height): row_offset = y * width * 4 for x in range(width): offset = row_offset + (x * 4) # RGBAを取得して輝度計算 r, g, b, a = data[offset: offset + 4] v = int(0.299 * r + 0.587 * g + 0.114 * b) # 直接上書き data[offset] = v data[offset + 1] = v data[offset + 2] = v # Alphaは維持 # 進捗報告(stderrを使用) if y % 20 == 0 or y == height - 1: progress = int((y + 1) / height * 100) sys.stderr.write(f"Progress: {progress}%\n") sys.stderr.flush() # 4. クローズ(アンリンクは親の役目) shm.close() except Exception as e: sys.stderr.write(f"Child Error: {e}\n") if __name__ == "__main__": process_shm_simple()