Загрузка данных


import os
import cv2
from PIL import Image

# Поддерживаемые расширения
IMAGE_EXTS = ['.png', '.jpg', '.jpeg', '.webp', '.bmp', '.tiff']
VIDEO_EXTS = ['.mp4', '.avi', '.mov', '.mkv', '.wmv']

def convert_image(input_path: str, target_format: str):
    """Конвертация изображений (PNG, JPG, WEBP и др.)"""
    ext = target_format.lower()
    if not ext.startswith('.'):
        ext = '.' + ext

    output_path = os.path.splitext(input_path)[0] + f"_converted{ext}"

    try:
        with Image.open(input_path) as img:
            # Для сохранения в JPG убираем прозрачность (Альфа-канал)
            if ext in ['.jpg', '.jpeg'] and img.mode in ('RGBA', 'LA', 'P'):
                img = img.convert('RGB')
            
            img.save(output_path)
            print(f"[✓] Картинка успешно сохранена: {output_path}")
    except Exception as e:
        print(f"[!] Ошибка конвертации картинки: {e}")

def convert_video(input_path: str, target_format: str):
    """Конвертация видео (MP4, AVI, MOV и др.)"""
    ext = target_format.lower()
    if not ext.startswith('.'):
        ext = '.' + ext

    output_path = os.path.splitext(input_path)[0] + f"_converted{ext}"

    cap = cv2.VideoCapture(input_path)
    if not cap.isOpened():
        print(f"[!] Ошибка: Не удалось открыть видео {input_path}")
        return

    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    if fps == 0:
        fps = 30.0

    # Выбираем подхощий FourCC-кодек в зависимости от формата
    if ext == '.mp4':
        fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    elif ext == '.avi':
        fourcc = cv2.VideoWriter_fourcc(*'XVID')
    else:
        fourcc = cv2.VideoWriter_fourcc(*'MJPG')

    out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))

    print(f"Обработка видео {input_path} -> {ext}...")
    frame_count = 0

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        out.write(frame)
        frame_count += 1

    cap.release()
    out.release()
    print(f"[✓] Видео успешно сохранено: {output_path} (кадров: {frame_count})")

def main():
    print("====================================")
    print("      УНИВЕРСАЛЬНЫЙ КОНВЕРТЕР       ")
    print("====================================")
    
    file_path = input("Перетащите файл сюда (или введите путь): ").strip(' "\'')
    
    if not os.path.exists(file_path):
        print("[!] Ошибка: Файл не найден!")
        return

    file_ext = os.path.splitext(file_path)[1].lower()

    if file_ext in IMAGE_EXTS:
        print(f"\n[+] Обнаружена картинка ({file_ext})")
        print("Доступные форматы: png, jpg, webp, bmp, tiff")
        target_fmt = input("В какой формат перевести? ").strip()
        convert_image(file_path, target_fmt)

    elif file_ext in VIDEO_EXTS:
        print(f"\n[+] Обнаружено видео ({file_ext})")
        print("Доступные форматы: mp4, avi, mov, mkv")
        target_fmt = input("В какой формат перевести? ").strip()
        convert_video(file_path, target_fmt)

    else:
        print("[!] Неподдерживаемый формат файла.")

if __name__ == "__main__":
    main()