本文由ScriptEcho平台提供技术支持
项目地址:传送门
该代码实现了一个基于 Hugging Face Transformers.js 库的图片任意元素分割功能。用户可以上传或选择一张图片,然后通过点击和右键单击在图片上标记出想要分割的区域。该代码使用 CLIP 模型对图片进行编码,并生成一张分割掩码,其中分割的区域用绿色填充。用户可以进一步使用该掩码来切割出图片中的特定元素。
该代码的主要功能包括:
onMounted(async () => {
// Reference the elements we will use
const statusLabel = document.getElementById('status');
const fileUpload = document.getElementById('upload');
const imageContainer = document.getElementById('container');
const example = document.getElementById('example');
const maskCanvas = document.getElementById('mask-output');
const uploadButton = document.getElementById('upload-button');
const resetButton = document.getElementById('reset-image');
const clearButton = document.getElementById('clear-points');
const cutButton = document.getElementById('cut-mask');
// ...
在onMounted
钩子中,我们首先引用了所有必要的元素。
// Create a web worker so that the main (UI) thread is not blocked during inference.
const worker = new Worker('/src/pages/test/ai/transformersjs/sam-worker.js', {
type: 'module',
});
我们创建一个 Web Worker 来处理图片编码和分割掩码生成,以避免阻塞主线程。
// Set up message handler
worker.addEventListener('message', (e) => {
const { type, data } = e.data;
if (type === 'ready') {
modelReady = true;
statusLabel.textContent = '已完成';
} else if (type === 'decode_result') {
// ...
} else if (type === 'segment_result') {
// ...
}
});
我们为 Web Worker 设置一个消息处理程序,用于处理从 Web Worker 接收到的消息。
function segment(data) {
// ...
// Instruct worker to segment the image
worker.postMessage({ type: 'segment', data });
}
segment
函数用于将图片发送到 Web Worker 进行编码。
function decode() {
// ...
worker.postMessage({ type: 'decode', data: lastPoints });
}
decode
函数用于将用户点击和右键单击的点发送到 Web Worker ,以生成分割掩码。
// Handle cut button click
cutButton.addEventListener('click', () => {
// ...
// Create a new canvas to hold the cut-out
const cutCanvas = new OffscreenCanvas(w, h);
const cutContext = cutCanvas.getContext('2d');
const cutPixelData = cutContext.getImageData(0, 0, w, h);
// ...
// Download image
const link = document.createElement('a');
link.download = 'image.png';
link.href = URL.createObjectURL(await cutCanvas.convertToBlob());
link.click();
link.remove();
});
cutButton
的点击事件处理程序用于切割出分割的区域并下载为 PNG 图片。
获取更多 Echos
本文由ScriptEcho平台提供技术支持
项目地址:传送门
扫码加入 AI 生成前端微信讨论群:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.