mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
feat(ui): paste canvas gens back on source in generate mode
This commit is contained in:
parent
ce854f086e
commit
05252a9bfc
@ -1,3 +1,4 @@
|
|||||||
|
import type { RootState } from 'app/store/store';
|
||||||
import type { CanvasManager } from 'features/controlLayers/konva/CanvasManager';
|
import type { CanvasManager } from 'features/controlLayers/konva/CanvasManager';
|
||||||
import { getPrefixedId } from 'features/controlLayers/konva/util';
|
import { getPrefixedId } from 'features/controlLayers/konva/util';
|
||||||
import type { CanvasV2State, Dimensions } from 'features/controlLayers/store/types';
|
import type { CanvasV2State, Dimensions } from 'features/controlLayers/store/types';
|
||||||
@ -7,6 +8,7 @@ import { isEqual } from 'lodash-es';
|
|||||||
import type { Invocation } from 'services/api/types';
|
import type { Invocation } from 'services/api/types';
|
||||||
|
|
||||||
export const addInpaint = async (
|
export const addInpaint = async (
|
||||||
|
state: RootState,
|
||||||
g: Graph,
|
g: Graph,
|
||||||
manager: CanvasManager,
|
manager: CanvasManager,
|
||||||
l2i: Invocation<'l2i'>,
|
l2i: Invocation<'l2i'>,
|
||||||
@ -22,6 +24,7 @@ export const addInpaint = async (
|
|||||||
): Promise<Invocation<'canvas_v2_mask_and_crop'>> => {
|
): Promise<Invocation<'canvas_v2_mask_and_crop'>> => {
|
||||||
denoise.denoising_start = denoising_start;
|
denoise.denoising_start = denoising_start;
|
||||||
|
|
||||||
|
const mode = state.canvasV2.session.mode;
|
||||||
const initialImage = await manager.compositor.getCompositeRasterLayerImageDTO(bbox.rect);
|
const initialImage = await manager.compositor.getCompositeRasterLayerImageDTO(bbox.rect);
|
||||||
const maskImage = await manager.compositor.getCompositeInpaintMaskImageDTO(bbox.rect);
|
const maskImage = await manager.compositor.getCompositeInpaintMaskImageDTO(bbox.rect);
|
||||||
|
|
||||||
@ -87,9 +90,13 @@ export const addInpaint = async (
|
|||||||
g.addEdge(createGradientMask, 'expanded_mask_area', resizeMaskToOriginalSize, 'image');
|
g.addEdge(createGradientMask, 'expanded_mask_area', resizeMaskToOriginalSize, 'image');
|
||||||
|
|
||||||
// Finally, paste the generated masked image back onto the original image
|
// Finally, paste the generated masked image back onto the original image
|
||||||
g.addEdge(resizeImageToOriginalSize, 'image', canvasPasteBack, 'image');
|
g.addEdge(resizeImageToOriginalSize, 'image', canvasPasteBack, 'generated_image');
|
||||||
g.addEdge(resizeMaskToOriginalSize, 'image', canvasPasteBack, 'mask');
|
g.addEdge(resizeMaskToOriginalSize, 'image', canvasPasteBack, 'mask');
|
||||||
|
|
||||||
|
if (mode === 'generate') {
|
||||||
|
canvasPasteBack.source_image = { image_name: initialImage.image_name };
|
||||||
|
}
|
||||||
|
|
||||||
return canvasPasteBack;
|
return canvasPasteBack;
|
||||||
} else {
|
} else {
|
||||||
// No scale before processing, much simpler
|
// No scale before processing, much simpler
|
||||||
@ -114,6 +121,7 @@ export const addInpaint = async (
|
|||||||
type: 'canvas_v2_mask_and_crop',
|
type: 'canvas_v2_mask_and_crop',
|
||||||
mask_blur: compositing.maskBlur,
|
mask_blur: compositing.maskBlur,
|
||||||
});
|
});
|
||||||
|
|
||||||
g.addEdge(alphaToMask, 'image', createGradientMask, 'mask');
|
g.addEdge(alphaToMask, 'image', createGradientMask, 'mask');
|
||||||
g.addEdge(i2l, 'latents', denoise, 'latents');
|
g.addEdge(i2l, 'latents', denoise, 'latents');
|
||||||
g.addEdge(vaeSource, 'vae', i2l, 'vae');
|
g.addEdge(vaeSource, 'vae', i2l, 'vae');
|
||||||
@ -122,7 +130,11 @@ export const addInpaint = async (
|
|||||||
g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask');
|
g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask');
|
||||||
g.addEdge(createGradientMask, 'expanded_mask_area', canvasPasteBack, 'mask');
|
g.addEdge(createGradientMask, 'expanded_mask_area', canvasPasteBack, 'mask');
|
||||||
|
|
||||||
g.addEdge(l2i, 'image', canvasPasteBack, 'image');
|
g.addEdge(l2i, 'image', canvasPasteBack, 'generated_image');
|
||||||
|
|
||||||
|
if (mode === 'generate') {
|
||||||
|
canvasPasteBack.source_image = { image_name: initialImage.image_name };
|
||||||
|
}
|
||||||
|
|
||||||
return canvasPasteBack;
|
return canvasPasteBack;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import type { RootState } from 'app/store/store';
|
||||||
import type { CanvasManager } from 'features/controlLayers/konva/CanvasManager';
|
import type { CanvasManager } from 'features/controlLayers/konva/CanvasManager';
|
||||||
import { getPrefixedId } from 'features/controlLayers/konva/util';
|
import { getPrefixedId } from 'features/controlLayers/konva/util';
|
||||||
import type { CanvasV2State, Dimensions } from 'features/controlLayers/store/types';
|
import type { CanvasV2State, Dimensions } from 'features/controlLayers/store/types';
|
||||||
@ -8,6 +9,7 @@ import { isEqual } from 'lodash-es';
|
|||||||
import type { Invocation } from 'services/api/types';
|
import type { Invocation } from 'services/api/types';
|
||||||
|
|
||||||
export const addOutpaint = async (
|
export const addOutpaint = async (
|
||||||
|
state: RootState,
|
||||||
g: Graph,
|
g: Graph,
|
||||||
manager: CanvasManager,
|
manager: CanvasManager,
|
||||||
l2i: Invocation<'l2i'>,
|
l2i: Invocation<'l2i'>,
|
||||||
@ -23,6 +25,7 @@ export const addOutpaint = async (
|
|||||||
): Promise<Invocation<'canvas_v2_mask_and_crop'>> => {
|
): Promise<Invocation<'canvas_v2_mask_and_crop'>> => {
|
||||||
denoise.denoising_start = denoising_start;
|
denoise.denoising_start = denoising_start;
|
||||||
|
|
||||||
|
const mode = state.canvasV2.session.mode;
|
||||||
const initialImage = await manager.compositor.getCompositeRasterLayerImageDTO(bbox.rect);
|
const initialImage = await manager.compositor.getCompositeRasterLayerImageDTO(bbox.rect);
|
||||||
const maskImage = await manager.compositor.getCompositeInpaintMaskImageDTO(bbox.rect);
|
const maskImage = await manager.compositor.getCompositeInpaintMaskImageDTO(bbox.rect);
|
||||||
const infill = getInfill(g, compositing);
|
const infill = getInfill(g, compositing);
|
||||||
@ -111,9 +114,13 @@ export const addOutpaint = async (
|
|||||||
g.addEdge(createGradientMask, 'expanded_mask_area', resizeOutputMaskToOriginalSize, 'image');
|
g.addEdge(createGradientMask, 'expanded_mask_area', resizeOutputMaskToOriginalSize, 'image');
|
||||||
|
|
||||||
// Finally, paste the generated masked image back onto the original image
|
// Finally, paste the generated masked image back onto the original image
|
||||||
g.addEdge(resizeOutputImageToOriginalSize, 'image', canvasPasteBack, 'image');
|
g.addEdge(resizeOutputImageToOriginalSize, 'image', canvasPasteBack, 'generated_image');
|
||||||
g.addEdge(resizeOutputMaskToOriginalSize, 'image', canvasPasteBack, 'mask');
|
g.addEdge(resizeOutputMaskToOriginalSize, 'image', canvasPasteBack, 'mask');
|
||||||
|
|
||||||
|
if (mode === 'generate') {
|
||||||
|
canvasPasteBack.source_image = { image_name: initialImage.image_name };
|
||||||
|
}
|
||||||
|
|
||||||
return canvasPasteBack;
|
return canvasPasteBack;
|
||||||
} else {
|
} else {
|
||||||
infill.image = { image_name: initialImage.image_name };
|
infill.image = { image_name: initialImage.image_name };
|
||||||
@ -158,7 +165,11 @@ export const addOutpaint = async (
|
|||||||
g.addEdge(modelLoader, 'unet', createGradientMask, 'unet');
|
g.addEdge(modelLoader, 'unet', createGradientMask, 'unet');
|
||||||
g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask');
|
g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask');
|
||||||
g.addEdge(createGradientMask, 'expanded_mask_area', canvasPasteBack, 'mask');
|
g.addEdge(createGradientMask, 'expanded_mask_area', canvasPasteBack, 'mask');
|
||||||
g.addEdge(l2i, 'image', canvasPasteBack, 'image');
|
g.addEdge(l2i, 'image', canvasPasteBack, 'generated_image');
|
||||||
|
|
||||||
|
if (mode === 'generate') {
|
||||||
|
canvasPasteBack.source_image = { image_name: initialImage.image_name };
|
||||||
|
}
|
||||||
|
|
||||||
return canvasPasteBack;
|
return canvasPasteBack;
|
||||||
}
|
}
|
||||||
|
@ -173,6 +173,7 @@ export const buildSD1Graph = async (
|
|||||||
} else if (generationMode === 'inpaint') {
|
} else if (generationMode === 'inpaint') {
|
||||||
const { compositing } = state.canvasV2;
|
const { compositing } = state.canvasV2;
|
||||||
canvasOutput = await addInpaint(
|
canvasOutput = await addInpaint(
|
||||||
|
state,
|
||||||
g,
|
g,
|
||||||
manager,
|
manager,
|
||||||
l2i,
|
l2i,
|
||||||
@ -189,6 +190,7 @@ export const buildSD1Graph = async (
|
|||||||
} else if (generationMode === 'outpaint') {
|
} else if (generationMode === 'outpaint') {
|
||||||
const { compositing } = state.canvasV2;
|
const { compositing } = state.canvasV2;
|
||||||
canvasOutput = await addOutpaint(
|
canvasOutput = await addOutpaint(
|
||||||
|
state,
|
||||||
g,
|
g,
|
||||||
manager,
|
manager,
|
||||||
l2i,
|
l2i,
|
||||||
|
@ -176,6 +176,7 @@ export const buildSDXLGraph = async (
|
|||||||
} else if (generationMode === 'inpaint') {
|
} else if (generationMode === 'inpaint') {
|
||||||
const { compositing } = state.canvasV2;
|
const { compositing } = state.canvasV2;
|
||||||
canvasOutput = await addInpaint(
|
canvasOutput = await addInpaint(
|
||||||
|
state,
|
||||||
g,
|
g,
|
||||||
manager,
|
manager,
|
||||||
l2i,
|
l2i,
|
||||||
@ -192,6 +193,7 @@ export const buildSDXLGraph = async (
|
|||||||
} else if (generationMode === 'outpaint') {
|
} else if (generationMode === 'outpaint') {
|
||||||
const { compositing } = state.canvasV2;
|
const { compositing } = state.canvasV2;
|
||||||
canvasOutput = await addOutpaint(
|
canvasOutput = await addOutpaint(
|
||||||
|
state,
|
||||||
g,
|
g,
|
||||||
manager,
|
manager,
|
||||||
l2i,
|
l2i,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user