File size: 13,102 Bytes
757d92c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
"""
AI Photo Edit - Hugging Face Spaces App
A web-based AI photo editing tool with Restyle, Enhance, and Fix capabilities
"""

import gradio as gr
import numpy as np
from PIL import Image, ImageEnhance, ImageFilter
from io import BytesIO
import base64

# Style configurations
RESTYLE_OPTIONS = {
    "Anime": "Transform into anime style with vibrant colors and expressive features",
    "Chibi Sticker": "Transform into cute chibi style with big head and small body",
    "Superhero": "Transform into superhero comic book style with dramatic lighting",
    "Graffiti": "Transform into urban graffiti street art style",
    "Watercolour": "Transform into watercolor painting with soft edges",
    "Comic": "Transform into comic book style with bold lines and halftone dots",
}

SEASON_OPTIONS = {
    "Summer": "Bright summer with warm golden sunlight and vibrant colors",
    "Winter": "Snowy winter with frost, cold blue tones",
    "Monsoon": "Rainy monsoon with wet surfaces and moody lighting",
}

ENHANCE_OPTIONS = {
    "Auto Enhance": "Improve colors, contrast, and sharpness",
    "HDR Effect": "Expand dynamic range for vivid details",
    "Sharpen": "Increase clarity and edge definition",
    "Reduce Noise": "Remove grain while preserving details",
}

FIX_OPTIONS = {
    "Blur Background": "Add portrait-style depth effect",
    "Relight": "Adjust lighting and shadows",
    "Fix Colors": "Correct white balance and color cast",
}


def apply_style(image, style_name, intensity=1.0):
    """Apply visual style filters to image"""
    if image is None:
        return None

    img = Image.fromarray(image)

    # Convert to RGB if needed
    if img.mode != 'RGB':
        img = img.convert('RGB')

    style_filters = {
        "Anime": lambda i: apply_anime(i, intensity),
        "Chibi Sticker": lambda i: apply_anime(i, intensity * 0.8),
        "Superhero": lambda i: apply_dramatic(i, intensity),
        "Graffiti": lambda i: apply_vibrant(i, intensity * 1.2),
        "Watercolour": lambda i: apply_watercolor(i, intensity),
        "Comic": lambda i: apply_comic(i, intensity),
        "Summer": lambda i: apply_summer(i, intensity),
        "Winter": lambda i: apply_winter(i, intensity),
        "Monsoon": lambda i: apply_monsoon(i, intensity),
        "Auto Enhance": lambda i: apply_enhance(i, intensity),
        "HDR Effect": lambda i: apply_hdr(i, intensity),
        "Sharpen": lambda i: apply_sharpen(i, intensity),
        "Reduce Noise": lambda i: apply_denoise(i, intensity),
        "Blur Background": lambda i: apply_blur_bg(i, intensity),
        "Relight": lambda i: apply_relight(i, intensity),
        "Fix Colors": lambda i: apply_fix_colors(i, intensity),
    }

    if style_name in style_filters:
        img = style_filters[style_name](img)

    return np.array(img)


def apply_anime(img, intensity):
    """Anime style: high saturation, contrast"""
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 0.5 * intensity)
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.25 * intensity)
    enhancer = ImageEnhance.Brightness(img)
    img = enhancer.enhance(1.0 + 0.05 * intensity)
    return img


def apply_dramatic(img, intensity):
    """Dramatic superhero style"""
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.5 * intensity)
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 0.3 * intensity)
    enhancer = ImageEnhance.Brightness(img)
    img = enhancer.enhance(1.0 - 0.05 * intensity)
    return img


def apply_vibrant(img, intensity):
    """Vibrant graffiti style"""
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 1.0 * intensity)
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.4 * intensity)
    return img


def apply_watercolor(img, intensity):
    """Watercolor painting effect"""
    img = img.filter(ImageFilter.GaussianBlur(radius=0.5 * intensity))
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 0.2 * intensity)
    return img


def apply_comic(img, intensity):
    """Comic book style"""
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.5 * intensity)
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 0.3 * intensity)
    return img


def apply_summer(img, intensity):
    """Warm summer tones"""
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 0.35 * intensity)
    enhancer = ImageEnhance.Brightness(img)
    img = enhancer.enhance(1.0 + 0.08 * intensity)
    # Add warm tint
    r, g, b = img.split()
    r = r.point(lambda x: min(255, x + int(10 * intensity)))
    img = Image.merge('RGB', (r, g, b))
    return img


def apply_winter(img, intensity):
    """Cool winter tones"""
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 - 0.25 * intensity)
    enhancer = ImageEnhance.Brightness(img)
    img = enhancer.enhance(1.0 + 0.12 * intensity)
    # Add cool tint
    r, g, b = img.split()
    b = b.point(lambda x: min(255, x + int(15 * intensity)))
    img = Image.merge('RGB', (r, g, b))
    return img


def apply_monsoon(img, intensity):
    """Moody monsoon effect"""
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 - 0.15 * intensity)
    enhancer = ImageEnhance.Brightness(img)
    img = enhancer.enhance(1.0 - 0.12 * intensity)
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.15 * intensity)
    return img


def apply_enhance(img, intensity):
    """Auto enhance"""
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.2 * intensity)
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 0.2 * intensity)
    enhancer = ImageEnhance.Sharpness(img)
    img = enhancer.enhance(1.0 + 0.1 * intensity)
    return img


def apply_hdr(img, intensity):
    """HDR effect"""
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.35 * intensity)
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 0.25 * intensity)
    return img


def apply_sharpen(img, intensity):
    """Sharpen image"""
    enhancer = ImageEnhance.Sharpness(img)
    img = enhancer.enhance(1.0 + 1.0 * intensity)
    return img


def apply_denoise(img, intensity):
    """Reduce noise (slight blur)"""
    img = img.filter(ImageFilter.GaussianBlur(radius=0.3 * intensity))
    enhancer = ImageEnhance.Sharpness(img)
    img = enhancer.enhance(1.0 + 0.2 * intensity)
    return img


def apply_blur_bg(img, intensity):
    """Blur background effect (simplified)"""
    img = img.filter(ImageFilter.GaussianBlur(radius=2 * intensity))
    return img


def apply_relight(img, intensity):
    """Adjust lighting"""
    enhancer = ImageEnhance.Brightness(img)
    img = enhancer.enhance(1.0 + 0.1 * intensity)
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.1 * intensity)
    return img


def apply_fix_colors(img, intensity):
    """Fix color cast"""
    enhancer = ImageEnhance.Color(img)
    img = enhancer.enhance(1.0 + 0.1 * intensity)
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.0 + 0.05 * intensity)
    return img


def apply_custom_prompt(image, prompt, intensity=1.0):
    """Apply style based on custom prompt keywords"""
    if image is None:
        return None

    prompt_lower = prompt.lower()

    # Detect style from prompt
    if any(word in prompt_lower for word in ['anime', 'cartoon', 'animated']):
        return apply_style(image, "Anime", intensity)
    elif any(word in prompt_lower for word in ['winter', 'snow', 'cold', 'frost']):
        return apply_style(image, "Winter", intensity)
    elif any(word in prompt_lower for word in ['summer', 'warm', 'sunny', 'bright']):
        return apply_style(image, "Summer", intensity)
    elif any(word in prompt_lower for word in ['vintage', 'sepia', 'old', 'retro']):
        img = Image.fromarray(image)
        if img.mode != 'RGB':
            img = img.convert('RGB')
        # Sepia effect
        enhancer = ImageEnhance.Color(img)
        img = enhancer.enhance(0.3)
        r, g, b = img.split()
        r = r.point(lambda x: min(255, x + 30))
        g = g.point(lambda x: min(255, x + 15))
        img = Image.merge('RGB', (r, g, b))
        return np.array(img)
    elif any(word in prompt_lower for word in ['black and white', 'grayscale', 'monochrome']):
        img = Image.fromarray(image)
        img = img.convert('L').convert('RGB')
        enhancer = ImageEnhance.Contrast(img)
        img = enhancer.enhance(1.1)
        return np.array(img)
    elif any(word in prompt_lower for word in ['comic', 'pop art']):
        return apply_style(image, "Comic", intensity)
    elif any(word in prompt_lower for word in ['watercolor', 'painting', 'artistic']):
        return apply_style(image, "Watercolour", intensity)
    elif any(word in prompt_lower for word in ['enhance', 'improve', 'better']):
        return apply_style(image, "Auto Enhance", intensity)
    else:
        # Default: subtle enhancement
        return apply_style(image, "Auto Enhance", intensity * 0.5)


# Create Gradio Interface
with gr.Blocks(
    title="AI Photo Edit",
    theme=gr.themes.Soft(
        primary_hue="blue",
        secondary_hue="slate",
    ),
    css="""
    .container { max-width: 1200px; margin: auto; }
    .title { text-align: center; margin-bottom: 1rem; }
    """
) as demo:

    gr.Markdown(
        """
        # AI Photo Edit
        Transform your photos with AI-powered styles, enhancements, and fixes.

        Upload an image and choose a style to apply!
        """
    )

    with gr.Row():
        with gr.Column(scale=2):
            input_image = gr.Image(label="Upload Image", type="numpy")
            output_image = gr.Image(label="Result", type="numpy")

        with gr.Column(scale=1):
            with gr.Tabs():
                with gr.TabItem("Restyle"):
                    gr.Markdown("### Artistic Styles")
                    restyle_dropdown = gr.Dropdown(
                        choices=list(RESTYLE_OPTIONS.keys()),
                        label="Choose Style",
                        value="Anime"
                    )
                    restyle_btn = gr.Button("Apply Restyle", variant="primary")

                    gr.Markdown("### Seasons")
                    season_dropdown = gr.Dropdown(
                        choices=list(SEASON_OPTIONS.keys()),
                        label="Choose Season",
                        value="Summer"
                    )
                    season_btn = gr.Button("Apply Season", variant="primary")

                    gr.Markdown("### Custom Prompt")
                    custom_prompt = gr.Textbox(
                        label="Describe your style",
                        placeholder="e.g., vintage sepia photograph from the 1920s"
                    )
                    custom_btn = gr.Button("Apply Custom", variant="primary")

                with gr.TabItem("Enhance"):
                    enhance_dropdown = gr.Dropdown(
                        choices=list(ENHANCE_OPTIONS.keys()),
                        label="Enhancement Type",
                        value="Auto Enhance"
                    )
                    enhance_btn = gr.Button("Apply Enhancement", variant="primary")

                with gr.TabItem("Fix"):
                    fix_dropdown = gr.Dropdown(
                        choices=list(FIX_OPTIONS.keys()),
                        label="Fix Type",
                        value="Relight"
                    )
                    fix_btn = gr.Button("Apply Fix", variant="primary")

            gr.Markdown("### Intensity")
            intensity_slider = gr.Slider(
                minimum=0.1,
                maximum=2.0,
                value=1.0,
                step=0.1,
                label="Effect Intensity"
            )

    # Event handlers
    restyle_btn.click(
        fn=apply_style,
        inputs=[input_image, restyle_dropdown, intensity_slider],
        outputs=output_image
    )

    season_btn.click(
        fn=apply_style,
        inputs=[input_image, season_dropdown, intensity_slider],
        outputs=output_image
    )

    custom_btn.click(
        fn=apply_custom_prompt,
        inputs=[input_image, custom_prompt, intensity_slider],
        outputs=output_image
    )

    enhance_btn.click(
        fn=apply_style,
        inputs=[input_image, enhance_dropdown, intensity_slider],
        outputs=output_image
    )

    fix_btn.click(
        fn=apply_style,
        inputs=[input_image, fix_dropdown, intensity_slider],
        outputs=output_image
    )

    gr.Markdown(
        """
        ---
        **Features:**
        - **Restyle**: Anime, Chibi, Superhero, Graffiti, Watercolour, Comic
        - **Seasons**: Summer, Winter, Monsoon
        - **Enhance**: Auto Enhance, HDR, Sharpen, Reduce Noise
        - **Fix**: Blur Background, Relight, Fix Colors

        Built with Gradio
        """
    )

if __name__ == "__main__":
    demo.launch()