| import gradio as gr |
| import numpy as np |
| from PIL import Image, ImageFilter |
| import torch |
| import cv2 |
|
|
| device = "cuda" if torch.cuda.is_available() else "cpu" |
|
|
| |
| from iopaint.model.lama import LaMa |
| from iopaint.schema import InpaintRequest, HDStrategy |
|
|
| model = LaMa(device=device) |
|
|
| def inpaint(editor_data, feather): |
| if editor_data is None: |
| return None |
|
|
| bg = editor_data.get("background") |
| layers = editor_data.get("layers", []) |
|
|
| if bg is None: |
| return None |
|
|
| image = bg.convert("RGB") |
| image_np = np.array(image) |
|
|
| if not layers or layers[0] is None: |
| return image |
|
|
| |
| layer = layers[0].convert("RGBA") |
| mask_np = np.array(layer)[:, :, 3] |
|
|
| |
| if feather > 0: |
| mask_pil = Image.fromarray(mask_np) |
| mask_pil = mask_pil.filter(ImageFilter.GaussianBlur(radius=feather)) |
| mask_np = np.array(mask_pil) |
|
|
| mask_np = (mask_np > 127).astype(np.uint8) * 255 |
|
|
| config = InpaintRequest(hd_strategy=HDStrategy.ORIGINAL) |
| result = model(image_np, mask_np, config) |
|
|
| return Image.fromarray(result) |
|
|
|
|
| with gr.Blocks(title="SFX Cleaner - LaMa Large") as demo: |
| gr.Markdown(""" |
| # 🧹 SFX Cleaner — lama_large_512px |
| **الطريقة:** ارفع الصورة ← ارسم بالفرشاة على النص/SFX ← اضغط **تبييض** |
| """) |
|
|
| with gr.Row(): |
| with gr.Column(scale=2): |
| editor = gr.ImageEditor( |
| label="📌 ارسم على النص", |
| brush=gr.Brush( |
| colors=["#ffffff"], |
| color_mode="fixed", |
| default_size=20 |
| ), |
| eraser=gr.Eraser(default_size=20), |
| type="pil", |
| height=650, |
| ) |
| with gr.Column(scale=1): |
| output = gr.Image( |
| label="✅ النتيجة", |
| type="pil", |
| height=650, |
| ) |
|
|
| with gr.Row(): |
| feather = gr.Slider(0, 8, value=2, step=1, label="نعومة الحواف (Feather)") |
| btn = gr.Button("🧹 تبييض", variant="primary", size="lg") |
|
|
| btn.click(fn=inpaint, inputs=[editor, feather], outputs=output) |
|
|
| demo.launch() |