Upload 6 files
Browse files- build/m_bg.wasm +2 -2
- index.html +58 -1
build/m_bg.wasm
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e1b97ef5bb8d7dda5f0d1475e02b666119e883fec44bfaaac25c2e985c7d0af0
|
| 3 |
+
size 2667539
|
index.html
CHANGED
|
@@ -11,7 +11,6 @@
|
|
| 11 |
<head>
|
| 12 |
<meta charset="UTF-8" />
|
| 13 |
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 14 |
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.1/iframeResizer.contentWindow.min.js"></script>
|
| 15 |
<style>
|
| 16 |
@import url("https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@200;300;400&family=Source+Sans+3:wght@100;200;300;400;500;600;700;800;900&display=swap");
|
| 17 |
html,
|
|
@@ -74,9 +73,12 @@
|
|
| 74 |
statusOutput.innerText = event.data.message;
|
| 75 |
}
|
| 76 |
|
|
|
|
|
|
|
| 77 |
const clearBtn = document.querySelector("#clear-btn");
|
| 78 |
const maskBtn = document.querySelector("#mask-btn");
|
| 79 |
const undoBtn = document.querySelector("#undo-btn");
|
|
|
|
| 80 |
const canvas = document.querySelector("#canvas");
|
| 81 |
const mask = document.querySelector("#mask");
|
| 82 |
const ctxCanvas = canvas.getContext("2d");
|
|
@@ -120,11 +122,13 @@
|
|
| 120 |
if (files.length > 0) {
|
| 121 |
const href = URL.createObjectURL(files[0]);
|
| 122 |
clearImageCanvas();
|
|
|
|
| 123 |
drawImageCanvas(href);
|
| 124 |
setImageEmbeddings(href);
|
| 125 |
togglePointMode(false);
|
| 126 |
} else if (url) {
|
| 127 |
clearImageCanvas();
|
|
|
|
| 128 |
drawImageCanvas(url);
|
| 129 |
setImageEmbeddings(url);
|
| 130 |
togglePointMode(false);
|
|
@@ -148,6 +152,7 @@
|
|
| 148 |
clearImageCanvas();
|
| 149 |
drawImageCanvas(href);
|
| 150 |
setImageEmbeddings(href);
|
|
|
|
| 151 |
}
|
| 152 |
});
|
| 153 |
//add event listener to mask button
|
|
@@ -164,6 +169,45 @@
|
|
| 164 |
undoBtn.addEventListener("click", () => {
|
| 165 |
undoPoint();
|
| 166 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
//add click event to canvas
|
| 168 |
canvas.addEventListener("click", async (event) => {
|
| 169 |
if (!hasImage || isEmbedding || isSegmenting) {
|
|
@@ -186,14 +230,17 @@
|
|
| 186 |
pointArr = [...pointArr, [x, y, !backgroundMode]];
|
| 187 |
}
|
| 188 |
undoBtn.disabled = false;
|
|
|
|
| 189 |
if (pointArr.length == 0) {
|
| 190 |
ctxMask.clearRect(0, 0, canvas.width, canvas.height);
|
| 191 |
undoBtn.disabled = true;
|
|
|
|
| 192 |
return;
|
| 193 |
}
|
| 194 |
isSegmenting = true;
|
| 195 |
const { maskURL } = await getSegmentationMask(pointArr);
|
| 196 |
isSegmenting = false;
|
|
|
|
| 197 |
drawMask(maskURL, pointArr);
|
| 198 |
});
|
| 199 |
|
|
@@ -213,6 +260,7 @@
|
|
| 213 |
isSegmenting = true;
|
| 214 |
const { maskURL } = await getSegmentationMask(pointArr);
|
| 215 |
isSegmenting = false;
|
|
|
|
| 216 |
drawMask(maskURL, pointArr);
|
| 217 |
}
|
| 218 |
function togglePointMode(mode) {
|
|
@@ -491,6 +539,15 @@
|
|
| 491 |
<img
|
| 492 |
src="https://huggingface.co/datasets/huggingface/badges/raw/main/share-to-community-sm.svg" />
|
| 493 |
</button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 494 |
</div>
|
| 495 |
</div>
|
| 496 |
<div>
|
|
|
|
| 11 |
<head>
|
| 12 |
<meta charset="UTF-8" />
|
| 13 |
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
| 14 |
<style>
|
| 15 |
@import url("https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@200;300;400&family=Source+Sans+3:wght@100;200;300;400;500;600;700;800;900&display=swap");
|
| 16 |
html,
|
|
|
|
| 73 |
statusOutput.innerText = event.data.message;
|
| 74 |
}
|
| 75 |
|
| 76 |
+
let copyMaskURL = null;
|
| 77 |
+
let copyImageURL = null;
|
| 78 |
const clearBtn = document.querySelector("#clear-btn");
|
| 79 |
const maskBtn = document.querySelector("#mask-btn");
|
| 80 |
const undoBtn = document.querySelector("#undo-btn");
|
| 81 |
+
const downloadBtn = document.querySelector("#download-btn");
|
| 82 |
const canvas = document.querySelector("#canvas");
|
| 83 |
const mask = document.querySelector("#mask");
|
| 84 |
const ctxCanvas = canvas.getContext("2d");
|
|
|
|
| 122 |
if (files.length > 0) {
|
| 123 |
const href = URL.createObjectURL(files[0]);
|
| 124 |
clearImageCanvas();
|
| 125 |
+
copyImageURL = href;
|
| 126 |
drawImageCanvas(href);
|
| 127 |
setImageEmbeddings(href);
|
| 128 |
togglePointMode(false);
|
| 129 |
} else if (url) {
|
| 130 |
clearImageCanvas();
|
| 131 |
+
copyImageURL = url;
|
| 132 |
drawImageCanvas(url);
|
| 133 |
setImageEmbeddings(url);
|
| 134 |
togglePointMode(false);
|
|
|
|
| 152 |
clearImageCanvas();
|
| 153 |
drawImageCanvas(href);
|
| 154 |
setImageEmbeddings(href);
|
| 155 |
+
copyImageURL = href;
|
| 156 |
}
|
| 157 |
});
|
| 158 |
//add event listener to mask button
|
|
|
|
| 169 |
undoBtn.addEventListener("click", () => {
|
| 170 |
undoPoint();
|
| 171 |
});
|
| 172 |
+
// add event to download btn
|
| 173 |
+
downloadBtn.addEventListener("click", async () => {
|
| 174 |
+
// Function to load image blobs as Image elements asynchronously
|
| 175 |
+
const loadImageAsync = (imageURL) => {
|
| 176 |
+
return new Promise((resolve) => {
|
| 177 |
+
const img = new Image();
|
| 178 |
+
img.onload = () => {
|
| 179 |
+
resolve(img);
|
| 180 |
+
};
|
| 181 |
+
img.src = imageURL;
|
| 182 |
+
});
|
| 183 |
+
};
|
| 184 |
+
const originalImage = await loadImageAsync(copyImageURL);
|
| 185 |
+
const maskImage = await loadImageAsync(copyMaskURL);
|
| 186 |
+
|
| 187 |
+
// create main a board to draw
|
| 188 |
+
const canvas = document.createElement("canvas");
|
| 189 |
+
const ctx = canvas.getContext("2d");
|
| 190 |
+
canvas.width = originalImage.width;
|
| 191 |
+
canvas.height = originalImage.height;
|
| 192 |
+
|
| 193 |
+
// Perform the mask operation
|
| 194 |
+
ctx.drawImage(maskImage, 0, 0);
|
| 195 |
+
ctx.globalCompositeOperation = "source-in";
|
| 196 |
+
ctx.drawImage(originalImage, 0, 0);
|
| 197 |
+
|
| 198 |
+
// to blob
|
| 199 |
+
const blobPromise = new Promise((resolve) => {
|
| 200 |
+
canvas.toBlob(resolve);
|
| 201 |
+
});
|
| 202 |
+
const blob = await blobPromise;
|
| 203 |
+
const resultURL = URL.createObjectURL(blob);
|
| 204 |
+
|
| 205 |
+
// download
|
| 206 |
+
const link = document.createElement("a");
|
| 207 |
+
link.href = resultURL;
|
| 208 |
+
link.download = "cutout.png";
|
| 209 |
+
link.click();
|
| 210 |
+
});
|
| 211 |
//add click event to canvas
|
| 212 |
canvas.addEventListener("click", async (event) => {
|
| 213 |
if (!hasImage || isEmbedding || isSegmenting) {
|
|
|
|
| 230 |
pointArr = [...pointArr, [x, y, !backgroundMode]];
|
| 231 |
}
|
| 232 |
undoBtn.disabled = false;
|
| 233 |
+
downloadBtn.disabled = false;
|
| 234 |
if (pointArr.length == 0) {
|
| 235 |
ctxMask.clearRect(0, 0, canvas.width, canvas.height);
|
| 236 |
undoBtn.disabled = true;
|
| 237 |
+
downloadBtn.disabled = true;
|
| 238 |
return;
|
| 239 |
}
|
| 240 |
isSegmenting = true;
|
| 241 |
const { maskURL } = await getSegmentationMask(pointArr);
|
| 242 |
isSegmenting = false;
|
| 243 |
+
copyMaskURL = maskURL;
|
| 244 |
drawMask(maskURL, pointArr);
|
| 245 |
});
|
| 246 |
|
|
|
|
| 260 |
isSegmenting = true;
|
| 261 |
const { maskURL } = await getSegmentationMask(pointArr);
|
| 262 |
isSegmenting = false;
|
| 263 |
+
copyMaskURL = maskURL;
|
| 264 |
drawMask(maskURL, pointArr);
|
| 265 |
}
|
| 266 |
function togglePointMode(mode) {
|
|
|
|
| 539 |
<img
|
| 540 |
src="https://huggingface.co/datasets/huggingface/badges/raw/main/share-to-community-sm.svg" />
|
| 541 |
</button>
|
| 542 |
+
|
| 543 |
+
<button
|
| 544 |
+
id="download-btn"
|
| 545 |
+
title="Copy result (.png)"
|
| 546 |
+
disabled
|
| 547 |
+
class="p-1 px-2 text-xs font-medium bg-white rounded-2xl outline outline-gray-200 hover:outline-orange-200 disabled:opacity-50"
|
| 548 |
+
>
|
| 549 |
+
Download the result (png file)
|
| 550 |
+
</button>
|
| 551 |
</div>
|
| 552 |
</div>
|
| 553 |
<div>
|