Path: blob/master/memo/comfyui_anidiff_long/combine.py
3275 views
import os1import shutil2from PIL import Image3import subprocess4import math5import glob67def blend_images(image1, image2, alpha=0.5):8"""두 이미지를 블렌딩합니다."""9return Image.blend(image1, image2, alpha)1011def process_images(source_dir, target_dir, max_images, video_output, fps, sound_file):12"""지정된 폴더에서 이미지를 처리하고 동영상으로 변환합니다."""13if not os.path.exists(target_dir):14os.makedirs(target_dir)15else:16shutil.rmtree(target_dir)17os.makedirs(target_dir)1819group_images = []20for subdir, _, files in os.walk(source_dir):21if subdir != source_dir:22images = [os.path.join(subdir, f) for f in sorted(files) if f.lower().endswith(('png', 'jpg', 'jpeg'))]23group_images.append((subdir, images))2425image_counter = 026blend_next = []2728for idx, (subdir, images) in enumerate(group_images):29print(f"# {subdir}")30extra_image_count = len(blend_next)3132if max_images == 0:33curr_max_images = math.floor(len(images) / 10) * 1034print(f"auto max_images: {curr_max_images}")35else:36curr_max_images = max_images3738# 현재 하위 목록이 마지막인지 확인39is_last_sublist = idx == len(group_images) - 14041extra_image_count = len(blend_next)42for i, image_path in enumerate(images):43print(f" - {image_path}")44if is_last_sublist or i < curr_max_images:45if len(blend_next) > 0:46opacity = 1 - (extra_image_count + 1 - len(blend_next))/(extra_image_count+1)47with Image.open(image_path) as img1, Image.open(blend_next.pop(0)) as img2:48blended = blend_images(img1, img2, opacity)49blended.save(os.path.join(target_dir, f"{image_counter+1:07d}.png"))50else:51#os.rename(image_path, os.path.join(target_dir, f"{image_counter+1:07d}.png"))52shutil.copy(image_path, os.path.join(target_dir, f"{image_counter+1:07d}.png"))53image_counter += 154else:55blend_next.append(image_path)5657# FFmpeg를 사용하여 동영상 생성58if video_output:59if sound_file and os.path.isfile(sound_file):60ffmpeg_command = f"ffmpeg -framerate {fps} -i {target_dir}/%07d.png -i {sound_file} -c:a copy -c:v libx264 -pix_fmt yuv420p -map 0:v -map 1:a {video_output}"61else:62ffmpeg_command = f"ffmpeg -framerate {fps} -i {target_dir}/%07d.png -c:v libx264 -pix_fmt yuv420p {video_output}"63subprocess.run(ffmpeg_command, shell=True)6465# 사용 예66source_dir = './extract' # 소스 폴더 경로67target_dir = './combine_old' # 타겟 폴더 경로6869video_output = 'output_video.mp4' # 출력 동영상 파일 이름70max_images_per_folder = 0 # 폴더당 최대 이미지 수, 0 이면 10의 배수로 자동 설정71fps = 3072sound_file = "sound.mp4" # 사운드파일 mp3, mp4등7374process_images(source_dir, target_dir, max_images_per_folder, video_output, fps, sound_file)757677