mirror of
https://github.com/huggingface/candle.git
synced 2025-06-18 11:37:11 +00:00
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:
@ -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>
|
||||||
|
Reference in New Issue
Block a user