일부 변환은 품질 손실이나 기능 제한이 있을 수있고(예 GIF -> JPG 변환시 애니메이션정보가 손실), 모든 조합이실용적이지는 않다(예: BMP는 용량이 커서 잘 사용하지 않음)
이제 실행해 보자
import os
from PIL import Image
def convert_image_format(folder_path, from_format, to_format):
"""
지정된 형식의 이미지를 다른 형식으로 변환합니다.
:param folder_path: 이미지가 있는 폴더 경로
:param from_format: 원본 이미지 형식 (예: 'webp', 'jpg', 'png')
:param to_format: 변환할 이미지 형식 (예: 'webp', 'jpg', 'png')
"""
# 형식에서 점 제거 및 소문자로 변환
from_format = from_format.lower().strip('.')
to_format = to_format.lower().strip('.')
if not os.path.exists(folder_path):
print(f"폴더를 찾을 수 없습니다: {folder_path}")
return
# 지원하는 형식 확인
supported_formats = {'webp', 'jpg', 'jpeg', 'png'}
if from_format not in supported_formats or to_format not in supported_formats:
print("지원하지 않는 형식입니다. webp, jpg, png 형식만 지원합니다.")
return
for filename in os.listdir(folder_path):
if filename.lower().endswith(f'.{from_format}'):
input_path = os.path.join(folder_path, filename)
output_filename = os.path.splitext(filename)[0] + f'.{to_format}'
output_path = os.path.join(folder_path, output_filename)
try:
with Image.open(input_path) as img:
# PNG로 변환할 때는 RGBA 모드 유지, 그 외에는 RGB로 변환
if to_format.lower() == 'png':
if img.mode != 'RGBA':
img = img.convert('RGBA')
else:
img = img.convert('RGB')
# 이미지 저장
if to_format.lower() == 'jpg':
img.save(output_path, 'JPEG', quality=95)
else:
img.save(output_path, to_format.upper())
print(f"변환 완료: {filename} -> {output_filename}")
# 원본 파일 삭제
os.remove(input_path)
print(f"원본 파일 삭제됨: {filename}")
except Exception as e:
print(f"파일 변환 중 오류 발생 {filename}: {e}")
# 사용 예시
if __name__ == "__main__":
folder_path = r"c:\Users\폴더" # 폴더 경로를 지정하세요
# WebP -> JPG 변환
convert_image_format(folder_path, 'webp', 'jpg')
# PNG -> JPG 변환
# convert_image_format(folder_path, 'png', 'jpg')
# WebP -> PNG 변환
# convert_image_format(folder_path, 'webp', 'png')
폴더 내에 있는
모든 webp 파일을 jpg 파일로 변환 시킨다
추가로 코드에서는 지정한 형식(`from_format`)의 파일만 검사하고 변환하기 때문에,
import os
import shutil
# 이동할 파일 확장자 목록 (필요에 따라 확장자를 추가할 수 있습니다)
video_extensions = ['.mp4', '.avi', '.mkv', '.mov', '.flv', '.wmv']
def organize_videos_into_folders(root_folder):
# root_folder 내의 항목들을 순회
for item_name in os.listdir(root_folder):
item_path = os.path.join(root_folder, item_name)
# 파일일 때만 실행하고, 확장자가 동영상 파일인지 확인
if os.path.isfile(item_path) and any(item_name.lower().endswith(ext) for ext in video_extensions):
# 동영상 파일 이름을 사용하여 하위 폴더 생성 (확장자 제거 후 공백 제거)
video_folder_name = os.path.splitext(item_name)[0].strip()
video_folder_path = os.path.join(root_folder, video_folder_name)
# 하위 폴더가 없으면 생성
if not os.path.exists(video_folder_path):
os.makedirs(video_folder_path)
print(f"Created folder: {video_folder_path}")
# 동영상 파일을 하위 폴더로 이동
new_file_path = os.path.join(video_folder_path, item_name)
shutil.move(item_path, new_file_path)
print(f"Moved {item_name} to {video_folder_path}")
root_folder = r"" # 폴더 경로를 입력하세요
organize_videos_into_folders(root_folder)
동영상 파일이 있는 폴더 주소를 입력하고 원하는 프레임을 입력하며 ( 초당 10회 or 60초 1회)
거기에 맞게 캡처 파일을 하위 폴더로 만들어 준다.
gpt로 생성한 이미지를 kling을 이용해 i2v로 만든 동영상캡처폴더 생성결과
import cv2
from pathlib import Path
from PIL import Image
import numpy as np
def capture_frames(video_folder, capture_rate=1):
"""
동영상의 프레임을 캡처하여 지정된 폴더에 저장합니다. Pillow를 사용하여 한글 경로 저장 문제를 해결합니다.
Args:
video_folder (str): 동영상 파일이 있는 폴더 경로
capture_rate (int): 초당 캡처할 프레임 수
"""
# 초당 최대 캡처 수 제한
if capture_rate > 10:
capture_rate = 10
print("Warning: 초당 캡처할 횟수는 최대 10으로 제한됩니다.")
# 경로 설정
video_folder = Path(video_folder)
capture_folder = video_folder / 'capture'
capture_folder.mkdir(exist_ok=True)
# 폴더 내 파일 목록 가져오기
video_files = [f for f in video_folder.iterdir() if f.suffix in ['.mp4', '.avi', '.mkv']]
for video_file in video_files:
video_path = str(video_file.resolve())
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print(f"Cannot open video: {video_path}")
continue
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_interval = max(1, fps // capture_rate)
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
capture_count = 0
frame_idx = 0
while frame_idx < frame_count:
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_idx)
ret, frame = cap.read()
if not ret or frame is None:
print(f"Failed to read frame at index {frame_idx}")
break
# 프레임 데이터를 Pillow로 저장
capture_filename = capture_folder / f"{video_file.stem}_frame_{capture_count:04d}.jpg"
capture_filename = str(capture_filename) # Pillow에서 사용할 경로는 문자열이어야 함
try:
# OpenCV 프레임 데이터를 Pillow 이미지로 변환
image = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
image.save(capture_filename)
print(f"Saved {capture_filename} using Pillow")
except Exception as e:
print(f"Failed to save {capture_filename} using Pillow: {e}")
capture_count += 1
frame_idx += frame_interval
cap.release()
print(f"Frames captured for {video_file} saved in {capture_folder}")
print("All captures complete.")
# 사용 예시
video_folder_path = r'c:\Users\eligh\Desktop\test\수정영상' # 한글 포함된 경로
capture_rate = 2 # 초당 1번 캡처하도록 설정
capture_frames(video_folder_path, capture_rate)
위는 짧은 영상용(한글명 경로로 인한 인코딩 오류 수정완료)
아래는 긴 영상용
#capture폴더에 바로 저장
import cv2
import os
def capture_frames(video_folder, capture_interval_sec=10):
"""
지정된 폴더의 동영상에서 일정 시간마다 프레임을 캡처하여 capture 폴더에 직접 저장합니다.
Args:
video_folder (str): 동영상 파일이 있는 폴더 경로
capture_interval_sec (int): 몇 초에 한 번씩 캡처할지 설정 (예: 10초에 한 번이면 10으로 설정)
"""
# 폴더 내 파일 목록 가져오기
video_files = [f for f in os.listdir(video_folder) if f.endswith(('.mp4', '.avi', '.mkv'))]
# 캡처 폴더 생성 (모든 캡처 이미지를 저장할 폴더)
capture_folder = os.path.join(video_folder, 'capture')
os.makedirs(capture_folder, exist_ok=True)
for video_file in video_files:
# 동영상 파일 열기
video_path = os.path.join(video_folder, video_file)
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print(f"Cannot open video {video_file}")
continue
# 동영상 정보 가져오기
fps = int(cap.get(cv2.CAP_PROP_FPS)) # 초당 프레임 수
frame_interval = int(fps * capture_interval_sec) # 캡처할 프레임 간격 설정
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
capture_count = 0
while capture_count * frame_interval < frame_count:
# 지정된 프레임 위치로 이동
cap.set(cv2.CAP_PROP_POS_FRAMES, capture_count * frame_interval)
ret, frame = cap.read()
if not ret:
break
# 캡처 이미지 저장 경로 설정 (동영상 이름과 프레임 번호를 포함하여 저장)
capture_filename = os.path.join(
capture_folder,
f"{os.path.splitext(video_file)[0]}_frame_{capture_count:04d}.jpg"
)
cv2.imwrite(capture_filename, frame)
capture_count += 1
cap.release()
print(f"Frames captured for {video_file} saved in {capture_folder}")
print("All captures complete.")
# 사용 예시
video_folder_path = r'' # 동영상 폴더 경로 설정
capture_interval_sec = 60 # 60초에 한 번씩 캡처하도록 설정
capture_frames(video_folder_path, capture_interval_sec)