File size: 2,676 Bytes
d15d416
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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()