gaur3009's picture
Update app.py
bfed5d9 verified
raw
history blame
4.15 kB
import gradio as gr
from PIL import Image, ImageOps, ImageEnhance, ImageFilter, ImageDraw
import numpy as np
import base64
from io import BytesIO
import json
def edit_image(image, grayscale, flip, rotate, brightness, contrast, color, crop_data, resize, blur, sharpness, draw_text, text_position, text_color, text_size):
img = Image.open(image)
if grayscale:
img = ImageOps.grayscale(img)
if flip:
img = ImageOps.flip(img)
if rotate:
img = img.rotate(rotate)
# Apply brightness
enhancer = ImageEnhance.Brightness(img)
img = enhancer.enhance(brightness)
# Apply contrast
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(contrast)
# Apply color
enhancer = ImageEnhance.Color(img)
img = enhancer.enhance(color)
# Apply crop
if crop_data:
crop = json.loads(crop_data)
img = img.crop((crop['x'], crop['y'], crop['x'] + crop['width'], crop['y'] + crop['height']))
# Apply resize
if resize:
width, height = map(int, resize.split(","))
img = img.resize((width, height))
# Apply blur
if blur > 0:
img = img.filter(ImageFilter.GaussianBlur(blur))
# Apply sharpness
enhancer = ImageEnhance.Sharpness(img)
img = enhancer.enhance(sharpness)
# Draw text
if draw_text:
draw = ImageDraw.Draw(img)
x, y = map(int, text_position.split(","))
draw.text((x, y), draw_text, fill=text_color, font=None, anchor=None, spacing=4, align="left")
return img
html_content = """
<!DOCTYPE html>
<html lang="en">
<head>
<link href="https://unpkg.com/cropperjs/dist/cropper.css" rel="stylesheet">
</head>
<body>
<div>
<img id="image" style="max-width: 100%;">
</div>
<script src="https://unpkg.com/cropperjs"></script>
<script>
const image = document.getElementById('image');
const cropper = new Cropper(image, {
aspectRatio: NaN,
viewMode: 1,
autoCropArea: 1,
crop(event) {
const cropData = {
x: event.detail.x,
y: event.detail.y,
width: event.detail.width,
height: event.detail.height
};
document.querySelector('textarea[name="data"]').value = JSON.stringify(cropData);
}
});
// Function to load image into cropper
window.loadImage = function (src) {
image.src = src;
cropper.replace(src);
}
</script>
</body>
</html>
"""
interface = gr.Interface(
fn=edit_image,
inputs=[
gr.Image(type="filepath", label="Upload Image"),
gr.Checkbox(label="Grayscale"),
gr.Checkbox(label="Flip Vertically"),
gr.Slider(minimum=0, maximum=360, step=1, value=0, label="Rotate Angle"),
gr.Slider(minimum=0.1, maximum=2, step=0.1, value=1, label="Brightness"),
gr.Slider(minimum=0.1, maximum=2, step=0.1, value=1, label="Contrast"),
gr.Slider(minimum=0.1, maximum=2, step=0.1, value=1, label="Color"),
gr.Textbox(label="Crop Data (JSON)", placeholder="{'x': 100, 'y': 100, 'width': 400, 'height': 400}"),
gr.Textbox(label="Resize (width, height)", placeholder="e.g., 800,600"),
gr.Slider(minimum=0, maximum=10, step=0.1, value=0, label="Blur"),
gr.Slider(minimum=0.1, maximum=2, step=0.1, value=1, label="Sharpness"),
gr.Textbox(label="Draw Text", placeholder="e.g., Hello World"),
gr.Textbox(label="Text Position (x, y)", placeholder="e.g., 100,100"),
gr.ColorPicker(label="Text Color"),
gr.Slider(minimum=10, maximum=100, step=1, value=30, label="Text Size")
],
outputs=gr.Image(),
live=True,
title="Advanced Image Editor",
description="Upload an image and apply various transformations including brightness, contrast, color adjustments, cropping, resizing, blurring, and adding text.",
layout="vertical",
theme="default",
css=html_content
)
interface.launch(share=True, debug=True, inline=True)