指定されたフォルダー内の画像を読み込み、360度の範囲で色相を15度ずつ変更し、新しい画像を別のフォルダーに保存するPythonプログラム

プログラム

import os
import numpy as np
from PIL import Image

# 入力フォルダーと出力フォルダーのパス
input_folder = r"D:\WinPython\notebooks\input_folder"
output_folder = r"D:\WinPython\notebooks\output_folder"

# 出力フォルダーが存在しなければ作成
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

def shift_hue_preserve_alpha(image, degree):
    """
    RGBA画像の透明部分を維持したまま色相をシフトする関数
    """
    shift_value = int(degree * 255 / 360)
    
    if image.mode == "RGBA":
        r, g, b, a = image.split()
        rgb_image = Image.merge("RGB", (r, g, b))
        hsv_image = rgb_image.convert("HSV")
        hsv_array = np.array(hsv_image, dtype=np.uint8)
        hsv_array[..., 0] = (hsv_array[..., 0].astype(int) + shift_value) % 256
        new_hsv_image = Image.fromarray(hsv_array, mode="HSV")
        new_rgb_image = new_hsv_image.convert("RGB")
        new_rgba_image = new_rgb_image.convert("RGBA")
        new_rgba_image.putalpha(a)
        return new_rgba_image
    else:
        hsv_image = image.convert("HSV")
        hsv_array = np.array(hsv_image, dtype=np.uint8)
        hsv_array[..., 0] = (hsv_array[..., 0].astype(int) + shift_value) % 256
        new_hsv_image = Image.fromarray(hsv_array, mode="HSV")
        new_rgb_image = new_hsv_image.convert("RGB")
        return new_rgb_image

for file_name in os.listdir(input_folder):
    if file_name.lower().endswith((".png", ".jpg", ".jpeg")):
        image_path = os.path.join(input_folder, file_name)
        original_image = Image.open(image_path)
        if original_image.mode != "RGBA":
            original_image = original_image.convert("RGBA")
        
        for degree in range(0, 360, 15):
            altered_image = shift_hue_preserve_alpha(original_image, degree)
            base_name, _ = os.path.splitext(file_name)
            # 三桁フォーマットで角度をファイル名に
            output_file_name = f"{base_name}_{degree:03}.png"
            output_path = os.path.join(output_folder, output_file_name)
            altered_image.save(output_path, "PNG")

print("すべての処理が完了しました!")

Python

Posted by eightban