From 074ce3805ada6ba829c17da3af5f186d9f5f9865 Mon Sep 17 00:00:00 2001 From: pngwn Date: Thu, 18 Apr 2024 11:55:00 -0400 Subject: [PATCH] ensure the `ImageEditor` works correctly with layers and `change` events (#8059) * stuff * fix layrs * add changeset * lint * ensure a default image can be passed when sources list is empty * fix loading status * add layers option to disable layer ui * types * fix tests * cleanup * cleanup * notebooks * fix composite * fix * fix trash icon * add changeset * fix layer bg * fix error display * notebooks --------- Co-authored-by: gradio-pr-bot --- .changeset/shy-pigs-buy.md | 7 ++ demo/image_editor_events/run.ipynb | 2 +- demo/image_editor_events/run.py | 1 - demo/image_editor_layers/cheetah.jpg | Bin 0 -> 53144 bytes demo/image_editor_layers/layer1.png | Bin 0 -> 1090 bytes demo/image_editor_layers/run.ipynb | 1 + demo/image_editor_layers/run.py | 76 ++++++++++++++ gradio/components/image_editor.py | 3 + gradio/templates.py | 6 ++ js/icons/src/Trash.svelte | 7 +- js/imageeditor/Index.svelte | 19 ++-- js/imageeditor/shared/ImageEditor.svelte | 14 ++- .../shared/InteractiveImageEditor.svelte | 32 +++--- js/imageeditor/shared/layers/Layers.svelte | 83 ++++++++------- js/imageeditor/shared/layers/utils.ts | 48 ++++++++- js/imageeditor/shared/tools/Sources.svelte | 96 +++++++++--------- test/test_components.py | 1 + 17 files changed, 280 insertions(+), 116 deletions(-) create mode 100644 .changeset/shy-pigs-buy.md create mode 100644 demo/image_editor_layers/cheetah.jpg create mode 100644 demo/image_editor_layers/layer1.png create mode 100644 demo/image_editor_layers/run.ipynb create mode 100644 demo/image_editor_layers/run.py diff --git a/.changeset/shy-pigs-buy.md b/.changeset/shy-pigs-buy.md new file mode 100644 index 0000000000..6e34a52643 --- /dev/null +++ b/.changeset/shy-pigs-buy.md @@ -0,0 +1,7 @@ +--- +"@gradio/icons": minor +"@gradio/imageeditor": minor +"gradio": minor +--- + +feat:ensure the `ImageEditor` works correctly with layers and `change` events diff --git a/demo/image_editor_events/run.ipynb b/demo/image_editor_events/run.ipynb index 192943f8b4..7db9c7a6de 100644 --- a/demo/image_editor_events/run.ipynb +++ b/demo/image_editor_events/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: image_editor_events"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "\n", "\n", "def predict(im):\n", " return im[\"composite\"]\n", "\n", "\n", "with gr.Blocks() as demo:\n", " with gr.Group():\n", " with gr.Row():\n", " im = gr.ImageEditor(\n", " type=\"numpy\",\n", " crop_size=\"1:1\",\n", " elem_id=\"image_editor\",\n", " interactive=True,\n", " )\n", " im_preview = gr.Image()\n", " with gr.Group():\n", " with gr.Row():\n", "\n", " n_upload = gr.Label(\n", " 0,\n", " label=\"upload\",\n", " elem_id=\"upload\",\n", " )\n", " n_change = gr.Label(\n", " 0,\n", " label=\"change\",\n", " elem_id=\"change\",\n", " )\n", " n_input = gr.Label(\n", " 0,\n", " label=\"input\",\n", " elem_id=\"input\",\n", " )\n", " n_apply = gr.Label(\n", " 0,\n", " label=\"apply\",\n", " elem_id=\"apply\",\n", " )\n", " clear_btn = gr.Button(\"Clear\", elem_id=\"clear\")\n", "\n", " im.upload(\n", " lambda x: int(x) + 1, outputs=n_upload, inputs=n_upload, show_progress=\"hidden\"\n", " )\n", " im.change(\n", " lambda x: int(x) + 1, outputs=n_change, inputs=n_change, show_progress=\"hidden\"\n", " )\n", " im.input(\n", " lambda x: int(x) + 1, outputs=n_input, inputs=n_input, show_progress=\"hidden\"\n", " )\n", " im.apply(\n", " lambda x: int(x) + 1, outputs=n_apply, inputs=n_apply, show_progress=\"hidden\"\n", " )\n", " im.change(predict, outputs=im_preview, inputs=im, show_progress=\"hidden\")\n", " clear_btn.click(\n", " lambda: None,\n", " None,\n", " im,\n", " )\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: image_editor_events"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "\n", "\n", "def predict(im):\n", " return im[\"composite\"]\n", "\n", "\n", "with gr.Blocks() as demo:\n", " with gr.Group():\n", " with gr.Row():\n", " im = gr.ImageEditor(\n", " type=\"numpy\",\n", " crop_size=\"1:1\",\n", " elem_id=\"image_editor\",\n", " )\n", " im_preview = gr.Image()\n", " with gr.Group():\n", " with gr.Row():\n", "\n", " n_upload = gr.Label(\n", " 0,\n", " label=\"upload\",\n", " elem_id=\"upload\",\n", " )\n", " n_change = gr.Label(\n", " 0,\n", " label=\"change\",\n", " elem_id=\"change\",\n", " )\n", " n_input = gr.Label(\n", " 0,\n", " label=\"input\",\n", " elem_id=\"input\",\n", " )\n", " n_apply = gr.Label(\n", " 0,\n", " label=\"apply\",\n", " elem_id=\"apply\",\n", " )\n", " clear_btn = gr.Button(\"Clear\", elem_id=\"clear\")\n", "\n", " im.upload(\n", " lambda x: int(x) + 1, outputs=n_upload, inputs=n_upload, show_progress=\"hidden\"\n", " )\n", " im.change(\n", " lambda x: int(x) + 1, outputs=n_change, inputs=n_change, show_progress=\"hidden\"\n", " )\n", " im.input(\n", " lambda x: int(x) + 1, outputs=n_input, inputs=n_input, show_progress=\"hidden\"\n", " )\n", " im.apply(\n", " lambda x: int(x) + 1, outputs=n_apply, inputs=n_apply, show_progress=\"hidden\"\n", " )\n", " im.change(predict, outputs=im_preview, inputs=im, show_progress=\"hidden\")\n", " clear_btn.click(\n", " lambda: None,\n", " None,\n", " im,\n", " )\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/image_editor_events/run.py b/demo/image_editor_events/run.py index 1bab6dab22..fb27d92ff1 100644 --- a/demo/image_editor_events/run.py +++ b/demo/image_editor_events/run.py @@ -12,7 +12,6 @@ with gr.Blocks() as demo: type="numpy", crop_size="1:1", elem_id="image_editor", - interactive=True, ) im_preview = gr.Image() with gr.Group(): diff --git a/demo/image_editor_layers/cheetah.jpg b/demo/image_editor_layers/cheetah.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1fde62d026aeb594fd6c989bc893da13e68b9dc GIT binary patch literal 53144 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

0N>*3{3iH93vMUVydb)=cW} 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%0A~ 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 literal 0 HcmV?d00001 diff --git a/demo/image_editor_layers/layer1.png b/demo/image_editor_layers/layer1.png new file mode 100644 index 0000000000000000000000000000000000000000..57d0c4016dec7c486e0732b3376b89fd9bbabff3 GIT binary patch literal 1090 zcmeAS@N?(olHy`uVBq!ia0y~yU0D;Q6Qy|>=ES4z)+>ez|hdb!0-zw z)bN6Vq11qZ;Z*_ygVhWM2JwP9y8>;168r%^A+A9BtdY@aBcn4$M*si+-*M$Y2vCT* zB*-tAp`o79-@pRMWlZvRcVX$zxEToKu$OrHy0X7u5#kXy5vgmw1Cq}#@(W=+zo>i` z0|V0yPZ!6Kid%2*ME2b_5OE32glnqf?M-q-+X*qam<-dckR{p!TZ2K;8$HX=$)$Qtg|D_xx%QFk1|R?N>sB(a#fldu7+kCS+7PqWSA%zF)E2F!$JkHQxt=j+9=Gr>jHS6X-p1h`NRqerfQS;|T7iViP*(LsF zb9KAmIum0NC)!%-<*sgN^VB5Qyxb&HS9VRD$=eIP3R!!!i5+ z$SDvjTlGHUy +

@@ -373,12 +375,14 @@ .stage-wrap { margin: var(--size-8); margin-bottom: var(--size-1); + border-radius: var(--radius-md); + overflow: hidden; } .tools-wrap { display: flex; justify-content: center; - align-items: flex-end; + align-items: center; padding: 0 var(--spacing-xl) 0 0; border: 1px solid var(--block-border-color); border-radius: var(--radius-sm); diff --git a/js/imageeditor/shared/InteractiveImageEditor.svelte b/js/imageeditor/shared/InteractiveImageEditor.svelte index eb03f02339..495590cee4 100644 --- a/js/imageeditor/shared/InteractiveImageEditor.svelte +++ b/js/imageeditor/shared/InteractiveImageEditor.svelte @@ -22,12 +22,12 @@ import { type Brush as IBrush } from "./tools/Brush.svelte"; import { type Eraser } from "./tools/Brush.svelte"; - export let brush: IBrush | null; - export let eraser: Eraser | null; import { Tools, Crop, Brush, Sources } from "./tools"; import { BlockLabel } from "@gradio/atoms"; import { Image as ImageIcon } from "@gradio/icons"; + export let brush: IBrush | null; + export let eraser: Eraser | null; export let sources: ("clipboard" | "webcam" | "upload")[]; export let crop_size: [number, number] | `${string}:${string}` | null = null; export let i18n: I18nFormatter; @@ -41,7 +41,9 @@ composite: null }; export let transforms: "crop"[] = ["crop"]; + export let layers: boolean; export let accept_blobs: (a: any) => void; + export let status: "pending" | "complete" | "error" = "complete"; const dispatch = createEventDispatcher<{ clear?: never; @@ -209,18 +211,17 @@ crop_constraint={!!crop_constraint} > - + + + - {#if sources && sources.length} - - {/if} {#if transforms.includes("crop")} {/if} @@ -239,7 +240,7 @@ {/if} - {#if !bg && !history && active_mode !== "webcam"} + {#if !bg && !history && active_mode !== "webcam" && status !== "error"}
{#if sources && sources.length}
Upload an image
@@ -278,13 +279,10 @@ flex-direction: column; justify-content: center; align-items: center; - min-height: var(--size-60); color: var(--block-label-text-color); line-height: var(--line-md); - /* height: 100%; */ font-size: var(--text-lg); pointer-events: none; - /* margin-top: var(--size-8); */ } .or { diff --git a/js/imageeditor/shared/layers/Layers.svelte b/js/imageeditor/shared/layers/Layers.svelte index 16847c8f7d..7a9d323b7e 100644 --- a/js/imageeditor/shared/layers/Layers.svelte +++ b/js/imageeditor/shared/layers/Layers.svelte @@ -10,6 +10,7 @@ let show_layers = false; export let layer_files: (FileData | null)[] | null = []; + export let enable_layers = true; const { pixi, current_layer, dimensions, register_context } = getContext(EDITOR_KEY); @@ -29,12 +30,13 @@ async function validate_layers(): Promise { let invalid = layers.some( (layer) => - layer.composite.texture.width != $dimensions[0] || - layer.composite.texture.height != $dimensions[1] + layer.composite.texture?.width != $dimensions[0] || + layer.composite.texture?.height != $dimensions[1] ); if (invalid) { LayerManager.reset(); - new_layer(); + if (!layer_files || layer_files.length == 0) new_layer(); + else render_layer_files(layer_files); } } $: $dimensions, validate_layers(); @@ -62,7 +64,11 @@ _layer_files: typeof layer_files ): Promise { await tick(); - if (!_layer_files || _layer_files.length == 0) return; + if (!_layer_files || _layer_files.length == 0) { + LayerManager.reset(); + new_layer(); + return; + } if (!$pixi) return; const fetch_promises = await Promise.all( @@ -87,7 +93,8 @@ last_layer = await LayerManager.add_layer_from_blob( $pixi.layer_container, $pixi.renderer, - blob + blob, + $pixi.view ); } @@ -105,36 +112,40 @@ }); -
(show_layers = false)} -> - - {#if show_layers} -
    - {#each layers as layer, i (i)} +{#if enable_layers} +
    (show_layers = false)} + > + + {#if show_layers} +
      + {#each layers as layer, i (i)} +
    • + +
    • + {/each}
    • - +
    • - {/each} -
    • - -
    • -
    - {/if} +
+ {/if} - -
+ +
+{/if}