feat: [SAM] able to download the result as png (#1035)

* feat: able to download the result as png

* feat: update function and wording
This commit is contained in:
lichin-lin
2023-10-05 22:14:47 +01:00
committed by GitHub
parent 7f7d95e2c3
commit 47c25a567b

View File

@ -73,9 +73,12 @@
statusOutput.innerText = event.data.message; statusOutput.innerText = event.data.message;
} }
let copyMaskURL = null;
let copyImageURL = null;
const clearBtn = document.querySelector("#clear-btn"); const clearBtn = document.querySelector("#clear-btn");
const maskBtn = document.querySelector("#mask-btn"); const maskBtn = document.querySelector("#mask-btn");
const undoBtn = document.querySelector("#undo-btn"); const undoBtn = document.querySelector("#undo-btn");
const downloadBtn = document.querySelector("#download-btn");
const canvas = document.querySelector("#canvas"); const canvas = document.querySelector("#canvas");
const mask = document.querySelector("#mask"); const mask = document.querySelector("#mask");
const ctxCanvas = canvas.getContext("2d"); const ctxCanvas = canvas.getContext("2d");
@ -93,6 +96,7 @@
if (target.files.length > 0) { if (target.files.length > 0) {
const href = URL.createObjectURL(target.files[0]); const href = URL.createObjectURL(target.files[0]);
clearImageCanvas(); clearImageCanvas();
copyImageURL = href;
drawImageCanvas(href); drawImageCanvas(href);
setImageEmbeddings(href); setImageEmbeddings(href);
togglePointMode(false); togglePointMode(false);
@ -119,11 +123,13 @@
if (files.length > 0) { if (files.length > 0) {
const href = URL.createObjectURL(files[0]); const href = URL.createObjectURL(files[0]);
clearImageCanvas(); clearImageCanvas();
copyImageURL = href;
drawImageCanvas(href); drawImageCanvas(href);
setImageEmbeddings(href); setImageEmbeddings(href);
togglePointMode(false); togglePointMode(false);
} else if (url) { } else if (url) {
clearImageCanvas(); clearImageCanvas();
copyImageURL = url;
drawImageCanvas(url); drawImageCanvas(url);
setImageEmbeddings(url); setImageEmbeddings(url);
togglePointMode(false); togglePointMode(false);
@ -145,6 +151,7 @@
if (target.nodeName === "IMG") { if (target.nodeName === "IMG") {
const href = target.src; const href = target.src;
clearImageCanvas(); clearImageCanvas();
copyImageURL = href;
drawImageCanvas(href); drawImageCanvas(href);
setImageEmbeddings(href); setImageEmbeddings(href);
} }
@ -163,6 +170,46 @@
undoBtn.addEventListener("click", () => { undoBtn.addEventListener("click", () => {
undoPoint(); undoPoint();
}); });
// add event to download btn
downloadBtn.addEventListener("click", async () => {
// Function to load image blobs as Image elements asynchronously
const loadImageAsync = (imageURL) => {
return new Promise((resolve) => {
const img = new Image();
img.onload = () => {
resolve(img);
};
img.crossOrigin = "anonymous";
img.src = imageURL;
});
};
const originalImage = await loadImageAsync(copyImageURL);
const maskImage = await loadImageAsync(copyMaskURL);
// create main a board to draw
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
canvas.width = originalImage.width;
canvas.height = originalImage.height;
// Perform the mask operation
ctx.drawImage(maskImage, 0, 0);
ctx.globalCompositeOperation = "source-in";
ctx.drawImage(originalImage, 0, 0);
// to blob
const blobPromise = new Promise((resolve) => {
canvas.toBlob(resolve);
});
const blob = await blobPromise;
const resultURL = URL.createObjectURL(blob);
// download
const link = document.createElement("a");
link.href = resultURL;
link.download = "cutout.png";
link.click();
});
//add click event to canvas //add click event to canvas
canvas.addEventListener("click", async (event) => { canvas.addEventListener("click", async (event) => {
if (!hasImage || isEmbedding || isSegmenting) { if (!hasImage || isEmbedding || isSegmenting) {
@ -185,14 +232,17 @@
pointArr = [...pointArr, [x, y, !backgroundMode]]; pointArr = [...pointArr, [x, y, !backgroundMode]];
} }
undoBtn.disabled = false; undoBtn.disabled = false;
downloadBtn.disabled = false;
if (pointArr.length == 0) { if (pointArr.length == 0) {
ctxMask.clearRect(0, 0, canvas.width, canvas.height); ctxMask.clearRect(0, 0, canvas.width, canvas.height);
undoBtn.disabled = true; undoBtn.disabled = true;
downloadBtn.disabled = true;
return; return;
} }
isSegmenting = true; isSegmenting = true;
const { maskURL } = await getSegmentationMask(pointArr); const { maskURL } = await getSegmentationMask(pointArr);
isSegmenting = false; isSegmenting = false;
copyMaskURL = maskURL;
drawMask(maskURL, pointArr); drawMask(maskURL, pointArr);
}); });
@ -212,6 +262,7 @@
isSegmenting = true; isSegmenting = true;
const { maskURL } = await getSegmentationMask(pointArr); const { maskURL } = await getSegmentationMask(pointArr);
isSegmenting = false; isSegmenting = false;
copyMaskURL = maskURL;
drawMask(maskURL, pointArr); drawMask(maskURL, pointArr);
} }
function togglePointMode(mode) { function togglePointMode(mode) {
@ -490,6 +541,15 @@
<img <img
src="https://huggingface.co/datasets/huggingface/badges/raw/main/share-to-community-sm.svg" /> src="https://huggingface.co/datasets/huggingface/badges/raw/main/share-to-community-sm.svg" />
</button> </button>
<button
id="download-btn"
title="Copy result (.png)"
disabled
class="p-1 px-2 text-xs font-medium bg-white rounded-2xl outline outline-gray-200 hover:outline-orange-200 disabled:opacity-50"
>
Download Cut-Out
</button>
</div> </div>
</div> </div>
<div> <div>