From 71314e47b1e505744f5ec8336fea0f7e45e0b4fb Mon Sep 17 00:00:00 2001 From: storyicon Date: Thu, 18 Apr 2024 11:59:25 +0000 Subject: [PATCH] feat:compatible with inconsistent/empty mask Signed-off-by: storyicon --- modules/masking.py | 4 ++-- modules/processing.py | 23 +++++++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/modules/masking.py b/modules/masking.py index 9f5b0cd03..29a394527 100644 --- a/modules/masking.py +++ b/modules/masking.py @@ -9,8 +9,8 @@ def get_crop_region(mask, pad=0): if box: x1, y1, x2, y2 = box else: # when no box is found - x1 = y1 = 0 - x2, y2 = mask_img.size + x1, y1 = mask_img.size + x2 = y2 = 0 return max(x1 - pad, 0), max(y1 - pad, 0), min(x2 + pad, mask_img.size[0]), min(y2 + pad, mask_img.size[1]) diff --git a/modules/processing.py b/modules/processing.py index c14b68965..1ee4c0477 100644 --- a/modules/processing.py +++ b/modules/processing.py @@ -1537,23 +1537,24 @@ class StableDiffusionProcessingImg2Img(StableDiffusionProcessing): if self.mask_blur_x > 0 or self.mask_blur_y > 0: self.extra_generation_params["Mask blur"] = self.mask_blur - if image_mask.size != (self.width, self.height): - image_mask = images.resize_image(self.resize_mode, image_mask, self.width, self.height) - if self.inpaint_full_res: self.mask_for_overlay = image_mask mask = image_mask.convert('L') crop_region = masking.get_crop_region(mask, self.inpaint_full_res_padding) - crop_region = masking.expand_crop_region(crop_region, self.width, self.height, mask.width, mask.height) - x1, y1, x2, y2 = crop_region - - mask = mask.crop(crop_region) - image_mask = images.resize_image(2, mask, self.width, self.height) - self.paste_to = (x1, y1, x2-x1, y2-y1) - + if crop_region[0] >= crop_region[2] and crop_region[1] >= crop_region[3]: + crop_region = None + image_mask = None + self.mask_for_overlay = None + else: + crop_region = masking.expand_crop_region(crop_region, self.width, self.height, mask.width, mask.height) + x1, y1, x2, y2 = crop_region + mask = mask.crop(crop_region) + image_mask = images.resize_image(2, mask, self.width, self.height) + self.paste_to = (x1, y1, x2-x1, y2-y1) self.extra_generation_params["Inpaint area"] = "Only masked" self.extra_generation_params["Masked area padding"] = self.inpaint_full_res_padding else: + image_mask = images.resize_image(self.resize_mode, image_mask, self.width, self.height) np_mask = np.array(image_mask) np_mask = np.clip((np_mask.astype(np.float32)) * 2, 0, 255).astype(np.uint8) self.mask_for_overlay = Image.fromarray(np_mask) @@ -1579,6 +1580,8 @@ class StableDiffusionProcessingImg2Img(StableDiffusionProcessing): image = images.resize_image(self.resize_mode, image, self.width, self.height) if image_mask is not None: + if self.mask_for_overlay.size != (image.width, image.height): + self.mask_for_overlay = images.resize_image(self.resize_mode, self.mask_for_overlay, image.width, image.height) image_masked = Image.new('RGBa', (image.width, image.height)) image_masked.paste(image.convert("RGBA").convert("RGBa"), mask=ImageOps.invert(self.mask_for_overlay.convert('L')))