diff --git a/scripts/main.py b/scripts/main.py index 2fac52d..4415032 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -67,13 +67,14 @@ async def maskExpansionHandler(request:Request): # keywords = json.get('keywords','cute dogs') base64_mask_image = json['mask'] mask_expansion = json['mask_expansion'] + blur = json['blur'] #convert base64 to img await img2imgapi.base64ToPng(base64_mask_image,"original_mask.png")#save a copy of the mask mask_image = img2imgapi.b64_2_img(base64_mask_image) - expanded_mask_img = img2imgapi.maskExpansion(mask_image,mask_expansion) + expanded_mask_img = img2imgapi.maskExpansion(mask_image,mask_expansion,blur) base64_expanded_mask_image = img2imgapi.img_2_b64(expanded_mask_img) await img2imgapi.base64ToPng(base64_expanded_mask_image,"expanded_mask.png")#save a copy of the mask diff --git a/server/python_server/img2imgapi.py b/server/python_server/img2imgapi.py index 1d6c22c..e451b97 100644 --- a/server/python_server/img2imgapi.py +++ b/server/python_server/img2imgapi.py @@ -32,7 +32,7 @@ def reserveBorderPixels(img,dilation_img): width, height = img.size dilation_pixels = dilation_img.load() all_pixels = [] - depth = 20 # five pixel depth + depth = 1 # five pixel depth for x in range(width): for d in range(depth): dilation_pixels[x,d] = pixels[x, d] @@ -44,7 +44,7 @@ def reserveBorderPixels(img,dilation_img): dilation_pixels[width-(d+1),y] = pixels[width-(d+1), y] return dilation_img -def maskExpansion(mask_img,mask_expansion): +def maskExpansion(mask_img,mask_expansion,blur =10): #only if image exist then try to open it @@ -53,8 +53,8 @@ def maskExpansion(mask_img,mask_expansion): # if(payload['use_sharp_mask'] == False):# use blurry mask iteration = mask_expansion dilated_img = applyDilation(mask_img,iteration) - mask_with_border = reserveBorderPixels(mask_img,dilated_img) - mask_with_border = mask_with_border.filter(ImageFilter.GaussianBlur(radius = 10)) + blurred_image = dilated_img.filter(ImageFilter.GaussianBlur(radius = blur)) + mask_with_border = reserveBorderPixels(mask_img,blurred_image) return mask_with_border async def base64ToPng(base64_image,image_path): diff --git a/server/python_server/serverMain.py b/server/python_server/serverMain.py index a1f8312..4da5dc4 100644 --- a/server/python_server/serverMain.py +++ b/server/python_server/serverMain.py @@ -323,13 +323,14 @@ async def maskExpansionHandler(request:Request): # keywords = json.get('keywords','cute dogs') base64_mask_image = json['mask'] mask_expansion = json['mask_expansion'] + blur = json['blur'] #convert base64 to img await img2imgapi.base64ToPng(base64_mask_image,"original_mask.png")#save a copy of the mask for debugging mask_image = img2imgapi.b64_2_img(base64_mask_image) - expanded_mask_img = img2imgapi.maskExpansion(mask_image,mask_expansion) + expanded_mask_img = img2imgapi.maskExpansion(mask_image,mask_expansion,blur) base64_expanded_mask_image = img2imgapi.img_2_b64(expanded_mask_img) await img2imgapi.base64ToPng(base64_expanded_mask_image,"expanded_mask.png")#save a copy of the mask of the expanded_mask for debugging diff --git a/typescripts/session/session.ts b/typescripts/session/session.ts index 63da924..6c2a530 100644 --- a/typescripts/session/session.ts +++ b/typescripts/session/session.ts @@ -103,6 +103,38 @@ const modeToClassMap: ModeToClassMap = { [GenerationModeEnum.Outpaint]: OutpaintMode, [GenerationModeEnum.Upscale]: UpscaleMode, } + +export async function getExpandedMask( + mask: string, + expansion_value: number, + blur: number +) { + try { + let use_sharp_mask = false + + let expanded_mask = mask + + if ( + use_sharp_mask === false && + mask && + expansion_value >= 0 && + blur >= 0 + ) { + //only if mask is available and sharp_mask is off + // use blurry and expanded mask + const iterations = expansion_value + expanded_mask = await python_replacement.maskExpansionRequest( + mask, + iterations, + blur + ) + } + + return expanded_mask + } catch (e) { + console.warn(e) + } +} export class Session { constructor() {} static async initializeSession(mode: GenerationModeEnum): Promise { diff --git a/utility/sdapi/python_replacement.js b/utility/sdapi/python_replacement.js index d47578d..01cf8fc 100644 --- a/utility/sdapi/python_replacement.js +++ b/utility/sdapi/python_replacement.js @@ -262,7 +262,7 @@ async function openUrlRequest(url) { console.warn(e) } } -async function maskExpansionRequest(original_mask, mask_expansion_value) { +async function maskExpansionRequest(original_mask, mask_expansion_value, blur) { // const endpoint = 'sdapi/v1/img2img' // const full_url = `${g_sd_url}/${endpoint}` @@ -270,6 +270,7 @@ async function maskExpansionRequest(original_mask, mask_expansion_value) { const payload = { mask: original_mask, mask_expansion: mask_expansion_value, + blur: blur, } const extension_url = getExtensionUrl() @@ -286,7 +287,7 @@ async function maskExpansionRequest(original_mask, mask_expansion_value) { let r = await request.json() - console.log('maskExpansionRequest json:', r) + // console.log('maskExpansionRequest json:', r) return r['mask'] } catch (e) { console.warn(e) diff --git a/utility/session.js b/utility/session.js index 6a87d77..b78087b 100644 --- a/utility/session.js +++ b/utility/session.js @@ -374,10 +374,11 @@ async function getSettings(session_data) { ) { //only if mask is available and sharp_mask is off // use blurry and expanded mask - const iterations = payload['mask_expansion'] + const expanded_mask = await py_re.maskExpansionRequest( payload['mask'], - iterations + payload['mask_expansion'], + mask_blur ) if (expanded_mask) { payload['expanded_mask'] = expanded_mask diff --git a/utility/tab/sd.js b/utility/tab/sd.js index 7593489..fa601b6 100644 --- a/utility/tab/sd.js +++ b/utility/tab/sd.js @@ -273,23 +273,37 @@ document.getElementById('btnUpdate').addEventListener('click', async () => { document .getElementById('slMaskExpansion') .addEventListener('change', async (evt) => { - document.getElementById('slMaskExpansion') - const original_mask = g_generation_session.activeBase64MaskImage - if (original_mask) { - //only if mask is available - // use blurry and expanded mask - const iterations = evt.target.value - const modified_mask = await py_re.maskExpansionRequest( - original_mask, - iterations - ) - if (modified_mask) { - g_generation_session.base64maskExpansionImage = modified_mask - viewMaskExpansion() - } + const mask = session_ts.store.data.preprocessed_mask + const iterations = parseInt(evt.target.value) + + const mask_blur = html_manip.getMaskBlur() + session_ts.store.data.expanded_mask = await session_ts.getExpandedMask( + mask, + iterations, + mask_blur + ) + if (session_ts.store.data.expanded_mask) { + viewMaskExpansion() } }) +document + .getElementById('slMaskBlur') + .addEventListener('change', async (evt) => { + const mask = session_ts.store.data.preprocessed_mask + const iterations = parseInt( + document.getElementById('slMaskExpansion').value + ) + const mask_blur = parseInt(evt.target.value) + session_ts.store.data.expanded_mask = await session_ts.getExpandedMask( + mask, + iterations, + mask_blur + ) + if (session_ts.store.data.expanded_mask) { + viewMaskExpansion() + } + }) document .getElementById('btnInterrogate') .addEventListener('click', async () => {