Update index.html
Browse files- index.html +33 -8
index.html
CHANGED
|
@@ -171,13 +171,30 @@
|
|
| 171 |
const targetBox = event.target.getBoundingClientRect();
|
| 172 |
const x = (event.clientX - targetBox.left) / targetBox.width;
|
| 173 |
const y = (event.clientY - targetBox.top) / targetBox.height;
|
| 174 |
-
|
| 175 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 176 |
undoBtn.disabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 177 |
const { maskURL } = await getSegmentationMask(pointArr);
|
| 178 |
isSegmenting = false;
|
| 179 |
drawMask(maskURL, pointArr);
|
| 180 |
});
|
|
|
|
| 181 |
async function undoPoint() {
|
| 182 |
if (!hasImage || isEmbedding || isSegmenting) {
|
| 183 |
return;
|
|
@@ -271,15 +288,23 @@
|
|
| 271 |
ctxMask.globalCompositeOperation = "destination-in";
|
| 272 |
ctxMask.drawImage(img, 0, 0);
|
| 273 |
ctxMask.globalCompositeOperation = "source-over";
|
| 274 |
-
|
| 275 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 276 |
ctxMask.beginPath();
|
| 277 |
-
ctxMask.arc(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 278 |
ctxMask.fill();
|
| 279 |
}
|
| 280 |
ctxMask.restore();
|
| 281 |
-
|
| 282 |
-
|
| 283 |
};
|
| 284 |
img.src = maskURL;
|
| 285 |
}
|
|
@@ -484,4 +509,4 @@
|
|
| 484 |
</div>
|
| 485 |
</main>
|
| 486 |
</body>
|
| 487 |
-
</html>
|
|
|
|
| 171 |
const targetBox = event.target.getBoundingClientRect();
|
| 172 |
const x = (event.clientX - targetBox.left) / targetBox.width;
|
| 173 |
const y = (event.clientY - targetBox.top) / targetBox.height;
|
| 174 |
+
const ptsToRemove = [];
|
| 175 |
+
for (const [idx, pts] of pointArr.entries()) {
|
| 176 |
+
const d = Math.sqrt((pts[0] - x) ** 2 + (pts[1] - y) ** 2);
|
| 177 |
+
if (d < 6 / targetBox.width) {
|
| 178 |
+
ptsToRemove.push(idx);
|
| 179 |
+
}
|
| 180 |
+
}
|
| 181 |
+
if (ptsToRemove.length > 0) {
|
| 182 |
+
pointArr = pointArr.filter((_, idx) => !ptsToRemove.includes(idx));
|
| 183 |
+
} else {
|
| 184 |
+
pointArr = [...pointArr, [x, y, !bgPointMode]];
|
| 185 |
+
}
|
| 186 |
undoBtn.disabled = false;
|
| 187 |
+
if(pointArr.length == 0) {
|
| 188 |
+
ctxMask.clearRect(0, 0, canvas.width, canvas.height);
|
| 189 |
+
undoBtn.disabled = true;
|
| 190 |
+
return;
|
| 191 |
+
}
|
| 192 |
+
isSegmenting = true;
|
| 193 |
const { maskURL } = await getSegmentationMask(pointArr);
|
| 194 |
isSegmenting = false;
|
| 195 |
drawMask(maskURL, pointArr);
|
| 196 |
});
|
| 197 |
+
|
| 198 |
async function undoPoint() {
|
| 199 |
if (!hasImage || isEmbedding || isSegmenting) {
|
| 200 |
return;
|
|
|
|
| 288 |
ctxMask.globalCompositeOperation = "destination-in";
|
| 289 |
ctxMask.drawImage(img, 0, 0);
|
| 290 |
ctxMask.globalCompositeOperation = "source-over";
|
| 291 |
+
for (const pt of points) {
|
| 292 |
+
if (pt[2]) {
|
| 293 |
+
ctxMask.fillStyle = "rgba(0, 255, 255, 1)";
|
| 294 |
+
} else {
|
| 295 |
+
ctxMask.fillStyle = "rgba(255, 255, 0, 1)";
|
| 296 |
+
}
|
| 297 |
ctxMask.beginPath();
|
| 298 |
+
ctxMask.arc(
|
| 299 |
+
pt[0] * canvas.width,
|
| 300 |
+
pt[1] * canvas.height,
|
| 301 |
+
3,
|
| 302 |
+
0,
|
| 303 |
+
2 * Math.PI
|
| 304 |
+
);
|
| 305 |
ctxMask.fill();
|
| 306 |
}
|
| 307 |
ctxMask.restore();
|
|
|
|
|
|
|
| 308 |
};
|
| 309 |
img.src = maskURL;
|
| 310 |
}
|
|
|
|
| 509 |
</div>
|
| 510 |
</main>
|
| 511 |
</body>
|
| 512 |
+
</html>
|