import gradio as gr from PIL import Image import cv2 import os def compress_image(image_path, mode, quality): # Открываем изображение image = Image.open(image_path) # Уменьшаем размер изображения без потери разрешения width, height = image.size image = image.resize((width // 2, height // 2), Image.Resampling.LANCZOS) # Применяем сжатие в зависимости от режима if mode == 'Фото': image = image.convert('RGB') image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) cv2.imwrite('temp.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), quality]) elif mode == 'Текстура': image = image.convert('RGBA') image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGRA) cv2.imwrite('temp.png', image, [int(cv2.IMWRITE_PNG_COMPRESSION), quality]) # Возвращаем увеличенное изображение compressed_image = Image.open('temp.jpg' if mode == 'Фото' else 'temp.png') compressed_image = compressed_image.resize((width, height), Image.Resampling.LANCZOS) # Удаляем временный файл os.remove('temp.jpg' if mode == 'Фото' else 'temp.png') return compressed_image def process_image(input_image, mode, compression_level): # Сохраняем загруженное изображение input_image.save('input.jpg') # Сжимаем изображение compressed_image = compress_image('input.jpg', mode, compression_level) # Удаляем временный файл os.remove('input.jpg') return compressed_image # Создаем интерфейс Gradio with gr.Blocks() as demo: gr.Markdown("## Интеллектуальное сжатие изображений") with gr.Row(): input_image = gr.Image(label="Загрузите изображение") output_image = gr.Image(label="Сжатое изображение") with gr.Row(): mode = gr.Dropdown( choices=['Фото', 'Текстура'], value='Фото', label="Режим сжатия" ) compression_level = gr.Slider( minimum=1, maximum=100, value=85, label="Уровень сжатия" ) compress_button = gr.Button("Сжать изображение") compress_button.click( process_image, inputs=[input_image, mode, compression_level], outputs=output_image ) # Запускаем приложение if __name__ == "__main__": demo.launch()