From 87bf2310b6a6c024274928f01fbe2c47e8782b76 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Thu, 17 Apr 2025 22:20:09 +0800 Subject: [PATCH] Support previewing animated image uploads (#3479) Co-authored-by: github-actions --- .github/workflows/test-ui.yaml | 2 +- browser_tests/assets/animated_webp.webp | Bin 0 -> 16056 bytes .../assets/widgets/load_animated_webp.json | 11 ++ .../assets/widgets/save_animated_webp.json | 60 +++++++++++ browser_tests/tests/widget.spec.ts | 99 ++++++++++++++++++ ...review-drag-and-dropped-chromium-linux.png | Bin 0 -> 76128 bytes ...-and-dropped-next-frame-chromium-linux.png | Bin 0 -> 106952 bytes ...mage-preview-saved-webp-chromium-linux.png | Bin 0 -> 115586 bytes src/composables/node/useNodeAnimatedImage.ts | 11 ++ src/composables/node/useNodeImage.ts | 14 ++- .../widgets/useImageUploadWidget.ts | 9 +- src/extensions/core/uploadImage.ts | 3 +- src/schemas/nodeDefSchema.ts | 1 + src/scripts/ui/imagePreview.ts | 4 + src/stores/imagePreviewStore.ts | 15 ++- src/utils/imageUtil.ts | 17 +++ 16 files changed, 232 insertions(+), 14 deletions(-) create mode 100644 browser_tests/assets/animated_webp.webp create mode 100644 browser_tests/assets/widgets/load_animated_webp.json create mode 100644 browser_tests/assets/widgets/save_animated_webp.json create mode 100644 browser_tests/tests/widget.spec.ts-snapshots/animated-image-preview-drag-and-dropped-chromium-linux.png create mode 100644 browser_tests/tests/widget.spec.ts-snapshots/animated-image-preview-drag-and-dropped-next-frame-chromium-linux.png create mode 100644 browser_tests/tests/widget.spec.ts-snapshots/animated-image-preview-saved-webp-chromium-linux.png diff --git a/.github/workflows/test-ui.yaml b/.github/workflows/test-ui.yaml index 4a52bf200..fb959d2f5 100644 --- a/.github/workflows/test-ui.yaml +++ b/.github/workflows/test-ui.yaml @@ -30,7 +30,7 @@ jobs: with: repository: 'Comfy-Org/ComfyUI_devtools' path: 'ComfyUI/custom_nodes/ComfyUI_devtools' - ref: '49c8220be49120dbaff85f32813d854d6dff2d05' + ref: '9d2421fd3208a310e4d0f71fca2ea0c985759c33' - uses: actions/setup-node@v4 with: diff --git a/browser_tests/assets/animated_webp.webp b/browser_tests/assets/animated_webp.webp new file mode 100644 index 0000000000000000000000000000000000000000..b844209126615b356f3e1590279737f5c59a4ce1 GIT binary patch literal 16056 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 literal 0 HcmV?d00001 diff --git a/browser_tests/assets/widgets/load_animated_webp.json b/browser_tests/assets/widgets/load_animated_webp.json new file mode 100644 index 000000000..561da3147 --- /dev/null +++ b/browser_tests/assets/widgets/load_animated_webp.json @@ -0,0 +1,11 @@ +{ + "8": { + "inputs": { + "image": "animated_web.webp" + }, + "class_type": "DevToolsLoadAnimatedImageTest", + "_meta": { + "title": "Load Animated Image" + } + } +} \ No newline at end of file diff --git a/browser_tests/assets/widgets/save_animated_webp.json b/browser_tests/assets/widgets/save_animated_webp.json new file mode 100644 index 000000000..362a56cec --- /dev/null +++ b/browser_tests/assets/widgets/save_animated_webp.json @@ -0,0 +1,60 @@ +{ + "id": "3f1fcbf9-f9de-4935-8fad-401813f61b13", + "revision": 0, + "last_node_id": 10, + "last_link_id": 4, + "nodes": [ + { + "id": 9, + "type": "SaveAnimatedWEBP", + "pos": [336, 104], + "size": [210, 368], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 4 + } + ], + "outputs": [], + "properties": {}, + "widgets_values": ["ComfyUI", 6, true, 80, "default"] + }, + { + "id": 10, + "type": "DevToolsLoadAnimatedImageTest", + "pos": [64, 104], + "size": [210, 316], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [4] + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "DevToolsLoadAnimatedImageTest" + }, + "widgets_values": ["animated_web.webp", "image"] + } + ], + "links": [[4, 10, 0, 9, 0, "IMAGE"]], + "groups": [], + "config": {}, + "extra": { + "frontendVersion": "1.17.0" + }, + "version": 0.4 +} diff --git a/browser_tests/tests/widget.spec.ts b/browser_tests/tests/widget.spec.ts index 1c3e809eb..2478c6b5a 100644 --- a/browser_tests/tests/widget.spec.ts +++ b/browser_tests/tests/widget.spec.ts @@ -186,6 +186,105 @@ test.describe('Image widget', () => { }) }) +test.describe('Animated image widget', () => { + test('Shows preview of uploaded animated image', async ({ comfyPage }) => { + await comfyPage.loadWorkflow('widgets/load_animated_webp') + + // Get position of the load animated webp node + const nodes = await comfyPage.getNodeRefsByType( + 'DevToolsLoadAnimatedImageTest' + ) + const loadAnimatedWebpNode = nodes[0] + const { x, y } = await loadAnimatedWebpNode.getPosition() + + // Drag and drop image file onto the load animated webp node + await comfyPage.dragAndDropFile('animated_webp.webp', { + dropPosition: { x, y } + }) + + // Expect the image preview to change automatically + await expect(comfyPage.canvas).toHaveScreenshot( + 'animated_image_preview_drag_and_dropped.png' + ) + + // Wait for animation to go to next frame + await comfyPage.page.waitForTimeout(512) + + // Move mouse and click on canvas to trigger render + await comfyPage.page.mouse.click(64, 64) + + // Expect the image preview to change to the next frame of the animation + await expect(comfyPage.canvas).toHaveScreenshot( + 'animated_image_preview_drag_and_dropped_next_frame.png' + ) + }) + + test('Can drag-and-drop animated webp image', async ({ comfyPage }) => { + await comfyPage.loadWorkflow('widgets/load_animated_webp') + + // Get position of the load animated webp node + const nodes = await comfyPage.getNodeRefsByType( + 'DevToolsLoadAnimatedImageTest' + ) + const loadAnimatedWebpNode = nodes[0] + const { x, y } = await loadAnimatedWebpNode.getPosition() + + // Drag and drop image file onto the load animated webp node + await comfyPage.dragAndDropFile('animated_webp.webp', { + dropPosition: { x, y } + }) + + // Expect the filename combo value to be updated + const fileComboWidget = await loadAnimatedWebpNode.getWidget(0) + const filename = await fileComboWidget.getValue() + expect(filename).toContain('animated_webp.webp') + }) + + test('Can preview saved animated webp image', async ({ comfyPage }) => { + await comfyPage.loadWorkflow('widgets/save_animated_webp') + + // Get position of the load animated webp node + const loadNodes = await comfyPage.getNodeRefsByType( + 'DevToolsLoadAnimatedImageTest' + ) + const loadAnimatedWebpNode = loadNodes[0] + const { x, y } = await loadAnimatedWebpNode.getPosition() + + // Drag and drop image file onto the load animated webp node + await comfyPage.dragAndDropFile('animated_webp.webp', { + dropPosition: { x, y } + }) + await comfyPage.nextFrame() + + // Get the SaveAnimatedWEBP node + const saveNodes = await comfyPage.getNodeRefsByType('SaveAnimatedWEBP') + const saveAnimatedWebpNode = saveNodes[0] + if (!saveAnimatedWebpNode) + throw new Error('SaveAnimatedWEBP node not found') + + // Simulate the graph executing + await comfyPage.page.evaluate( + ([loadId, saveId]) => { + // Set the output of the SaveAnimatedWEBP node to equal the loader node's image + window['app'].nodeOutputs[saveId] = window['app'].nodeOutputs[loadId] + }, + [loadAnimatedWebpNode.id, saveAnimatedWebpNode.id] + ) + await comfyPage.nextFrame() + + // Wait for animation to go to next frame + await comfyPage.page.waitForTimeout(512) + + // Move mouse and click on canvas to trigger render + await comfyPage.page.mouse.click(64, 64) + + // Expect the SaveAnimatedWEBP node to have an output preview + await expect(comfyPage.canvas).toHaveScreenshot( + 'animated_image_preview_saved_webp.png' + ) + }) +}) + test.describe('Load audio widget', () => { test('Can load audio', async ({ comfyPage }) => { await comfyPage.loadWorkflow('widgets/load_audio_widget') diff --git a/browser_tests/tests/widget.spec.ts-snapshots/animated-image-preview-drag-and-dropped-chromium-linux.png b/browser_tests/tests/widget.spec.ts-snapshots/animated-image-preview-drag-and-dropped-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..a264d017c6b7676e7e65c6341c917257a1de68ed GIT binary patch literal 76128 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