You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用未保存的摄像头图像设置Fabric.js画布背景?

摄像头捕获照片结合Fabric.js编辑的问题

我正在使用Media Capture and Streams API初始化摄像头,允许用户从摄像头流中捕获照片;同时尝试用Fabric.js让用户编辑/标记这些照片。

HTML结构

我的HTML包含如下canvas和video元素:

<canvas id="img-canvas"> </canvas>
<video id="img-stream" autoplay></video>

摄像头初始化代码

我通过以下代码启动摄像头:

navigator.mediaDevices
    .getUserMedia(constraints)
    .then((stream) => {
        const videoTracks = stream.getVideoTracks();
        video.srcObject = stream;
    })
    .catch((error) => {
       // 错误处理
    });

照片捕获代码

通过以下代码从实时流中捕获照片:

const context = canvas.getContext("2d");
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
return canvas.toDataURL("image/png"); // 返回可用于设置<img> src的base64字符串

Fabric.js画布初始化

并通过以下代码初始化Fabric.js画布:

canvas = new fabric.Canvas("img-canvas");

遇到的问题

  • 当使用Fabric.js向画布添加图形或其他对象时,捕获的图像会消失。例如添加圆形的代码:
canvas.add(new fabric.Circle({
    id: "circle1",
    left: canvas.width / 2,
    top: canvas.height / 2,
    fill: 'rgba(0,0,0,0)',
    stroke: 'red',
    width: 50,
    height: 50,
    originX: 'center',
    originY: 'center',
    strokeWidth: 3,
    radius: 20
}));
  • 尝试用Fabric.js设置画布背景,但似乎需要有效的URL:
canvas.setBackgroundImage(imageData, canvas.renderAll.bind(canvas));
  • 尝试用<img>元素添加图像到Fabric.js画布:将<img>标签的src设置为canvas.toDataURL("image/png")的结果(这对<img>元素有效),但仍无法添加成功,代码如下:
var cvsimg = document.getElementById("captured-img");
var image = new fabric.Image(cvsimg, {
    opacity: 1,
    left: 0,
    top: 0,
});
canvas.add(image);

需求

我需要一种方法:要么能向现有<canvas>添加Fabric.js对象且图像不消失,要么能用Fabric.js将未保存的图像设置为画布背景。

内容的提问来源于stack exchange,提问作者Smitty-Werben-Jager-Manjenson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:52:39