diff --git a/scripts/check_modules.py b/scripts/check_modules.py
index 7a59a7b4..bad46943 100644
--- a/scripts/check_modules.py
+++ b/scripts/check_modules.py
@@ -18,7 +18,7 @@ os_name = platform.system()
modules_to_check = {
"torch": ("1.11.0", "1.13.1", "2.0.0"),
"torchvision": ("0.12.0", "0.14.1", "0.15.1"),
- "sdkit": "1.0.148",
+ "sdkit": "1.0.151",
"stable-diffusion-sdkit": "2.1.4",
"rich": "12.6.0",
"uvicorn": "0.19.0",
diff --git a/ui/easydiffusion/types.py b/ui/easydiffusion/types.py
index b1d55f5a..894867b8 100644
--- a/ui/easydiffusion/types.py
+++ b/ui/easydiffusion/types.py
@@ -21,6 +21,7 @@ class GenerateImageRequest(BaseModel):
control_alpha: Union[float, List[float]] = None
prompt_strength: float = 0.8
preserve_init_image_color_profile = False
+ strict_mask_border = False
sampler_name: str = None # "ddim", "plms", "heun", "euler", "euler_a", "dpm2", "dpm2_a", "lms"
hypernetwork_strength: float = 0
diff --git a/ui/index.html b/ui/index.html
index 8d5b0f11..0fcb807d 100644
--- a/ui/index.html
+++ b/ui/index.html
@@ -109,6 +109,7 @@
+
diff --git a/ui/media/js/image-editor.js b/ui/media/js/image-editor.js
index 30026e02..dac172fd 100644
--- a/ui/media/js/image-editor.js
+++ b/ui/media/js/image-editor.js
@@ -626,6 +626,7 @@ class ImageEditor {
.getImageData(0, 0, this.width, this.height)
.data.some((channel) => channel !== 0)
maskSetting.checked = !is_blank
+ maskSetting.dispatchEvent(new Event("change"))
}
this.hide()
}
diff --git a/ui/media/js/main.js b/ui/media/js/main.js
index d903fad3..de518c4c 100644
--- a/ui/media/js/main.js
+++ b/ui/media/js/main.js
@@ -49,6 +49,7 @@ const taskConfigSetup = {
use_lora_model: { label: "Lora Model", visible: ({ reqBody }) => !!reqBody?.use_lora_model },
lora_alpha: { label: "Lora Strength", visible: ({ reqBody }) => !!reqBody?.use_lora_model },
preserve_init_image_color_profile: "Preserve Color Profile",
+ strict_mask_border: "Strict Mask Border",
},
pluginTaskConfig: {},
getCSSKey: (key) =>
@@ -93,7 +94,9 @@ let initImageSizeBox = document.querySelector("#init_image_size_box")
let maskImageSelector = document.querySelector("#mask")
let maskImagePreview = document.querySelector("#mask_preview")
let applyColorCorrectionField = document.querySelector("#apply_color_correction")
+let strictMaskBorderField = document.querySelector("#strict_mask_border")
let colorCorrectionSetting = document.querySelector("#apply_color_correction_setting")
+let strictMaskBorderSetting = document.querySelector("#strict_mask_border_setting")
let promptStrengthSlider = document.querySelector("#prompt_strength_slider")
let promptStrengthField = document.querySelector("#prompt_strength")
let samplerField = document.querySelector("#sampler_name")
@@ -1386,6 +1389,7 @@ function getCurrentUserRequest() {
// }
if (maskSetting.checked) {
newTask.reqBody.mask = imageInpainter.getImg()
+ newTask.reqBody.strict_mask_border = strictMaskBorderField.checked
}
newTask.reqBody.preserve_init_image_color_profile = applyColorCorrectionField.checked
if (!testDiffusers.checked) {
@@ -2091,6 +2095,7 @@ function img2imgLoad() {
}
initImagePreviewContainer.classList.add("has-image")
colorCorrectionSetting.style.display = ""
+ strictMaskBorderSetting.style.display = maskSetting.checked ? "" : "none"
initImageSizeBox.textContent = initImagePreview.naturalWidth + " x " + initImagePreview.naturalHeight
imageEditor.setImage(this.src, initImagePreview.naturalWidth, initImagePreview.naturalHeight)
@@ -2108,6 +2113,7 @@ function img2imgUnload() {
}
initImagePreviewContainer.classList.remove("has-image")
colorCorrectionSetting.style.display = "none"
+ strictMaskBorderSetting.style.display = "none"
imageEditor.setImage(null, parseInt(widthField.value), parseInt(heightField.value))
}
initImagePreview.addEventListener("load", img2imgLoad)
@@ -2116,6 +2122,9 @@ initImageClearBtn.addEventListener("click", img2imgUnload)
maskSetting.addEventListener("click", function() {
onDimensionChange()
})
+maskSetting.addEventListener("change", function() {
+ strictMaskBorderSetting.style.display = this.checked ? "" : "none"
+})
promptsFromFileBtn.addEventListener("click", function() {
promptsFromFileSelector.click()
@@ -2583,27 +2592,28 @@ createLoraEntries()
////////////////////////////// Image Size Widget //////////////////////////////////////////
function roundToMultiple(number, n) {
- if (n=="") { n=1 }
- return Math.round(number / n) * n;
+ if (n == "") {
+ n = 1
+ }
+ return Math.round(number / n) * n
}
function addImageSizeOption(size) {
- let sizes = Object.values(widthField.options).map(o => o.value)
+ let sizes = Object.values(widthField.options).map((o) => o.value)
if (!sizes.includes(String(size))) {
sizes.push(String(size))
- sizes.sort( (a,b) => Number(a)-Number(b) )
+ sizes.sort((a, b) => Number(a) - Number(b))
let option = document.createElement("option")
option.value = size
option.text = `${size}`
-
+
widthField.add(option, sizes.indexOf(String(size)))
heightField.add(option.cloneNode(true), sizes.indexOf(String(size)))
}
-
}
-function setImageWidthHeight(w,h) {
+function setImageWidthHeight(w, h) {
let step = customWidthField.step
w = roundToMultiple(w, step)
h = roundToMultiple(h, step)
@@ -2611,8 +2621,8 @@ function setImageWidthHeight(w,h) {
addImageSizeOption(w)
addImageSizeOption(h)
- widthField.value=w
- heightField.value=h
+ widthField.value = w
+ heightField.value = h
widthField.dispatchEvent(new Event("change"))
heightField.dispatchEvent(new Event("change"))
}
@@ -2620,25 +2630,26 @@ function setImageWidthHeight(w,h) {
function enlargeImageSize(factor) {
let step = customWidthField.step
- let w = roundToMultiple(widthField.value*factor, step)
- let h = roundToMultiple(heightField.value*factor, step)
+ let w = roundToMultiple(widthField.value * factor, step)
+ let h = roundToMultiple(heightField.value * factor, step)
customWidthField.value = w
customHeightField.value = h
}
let recentResolutionsValues = []
-;(function() { ///// Init resolutions dropdown
+;(function() {
+ ///// Init resolutions dropdown
function makeResolutionButtons() {
recentResolutionList.innerHTML = ""
- recentResolutionsValues.forEach( el => {
+ recentResolutionsValues.forEach((el) => {
let button = document.createElement("button")
button.classList.add("tertiaryButton")
- button.style.width="8em"
+ button.style.width = "8em"
button.innerHTML = `${el.w}×${el.h}`
button.addEventListener("click", () => {
- customWidthField.value=el.w
- customHeightField.value=el.h
+ customWidthField.value = el.w
+ customHeightField.value = el.h
hidePopup()
})
recentResolutionList.appendChild(button)
@@ -2665,7 +2676,7 @@ let recentResolutionsValues = []
customWidthField.addEventListener("change", () => {
let w = customWidthField.value
customWidthField.value = roundToMultiple(w, customWidthField.step)
- if (w!=customWidthField.value) {
+ if (w != customWidthField.value) {
showToast(`Rounded width to the closest multiple of ${customWidthField.step}.`)
}
})
@@ -2673,7 +2684,7 @@ let recentResolutionsValues = []
customHeightField.addEventListener("change", () => {
let h = customHeightField.value
customHeightField.value = roundToMultiple(h, customHeightField.step)
- if (h!=customHeightField.value) {
+ if (h != customHeightField.value) {
showToast(`Rounded height to the closest multiple of ${customHeightField.step}.`)
}
})
@@ -2682,24 +2693,24 @@ let recentResolutionsValues = []
let w = widthField.value
let h = heightField.value
- recentResolutionsValues = recentResolutionsValues.filter(el => (el.w!=w || el.h!=h))
- recentResolutionsValues.unshift({w: w, h:h})
- recentResolutionsValues = recentResolutionsValues.slice(0,8)
+ recentResolutionsValues = recentResolutionsValues.filter((el) => el.w != w || el.h != h)
+ recentResolutionsValues.unshift({ w: w, h: h })
+ recentResolutionsValues = recentResolutionsValues.slice(0, 8)
localStorage.recentResolutionsValues = JSON.stringify(recentResolutionsValues)
makeResolutionButtons()
})
let _jsonstring = localStorage.recentResolutionsValues
- if (_jsonstring==undefined) {
+ if (_jsonstring == undefined) {
recentResolutionsValues = [
- {w:512,h:512},
- {w:640,h:448},
- {w:448,h:640},
- {w:512,h:768},
- {w:768,h:512},
- {w:1024,h:768},
- {w:768,h:1024},
+ { w: 512, h: 512 },
+ { w: 640, h: 448 },
+ { w: 448, h: 640 },
+ { w: 512, h: 768 },
+ { w: 768, h: 512 },
+ { w: 1024, h: 768 },
+ { w: 768, h: 1024 },
]
localStorage.recentResolutionsValues = JSON.stringify(recentResolutionsValues)
} else {
@@ -2707,7 +2718,7 @@ let recentResolutionsValues = []
}
makeResolutionButtons()
- recentResolutionsValues.forEach( val => {
+ recentResolutionsValues.forEach((val) => {
addImageSizeOption(val.w)
addImageSizeOption(val.h)
})
@@ -2746,4 +2757,3 @@ let recentResolutionsValues = []
heightField.value = temp
})
})()
-