|
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 |
|
|
|
|
|
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() |