使用 FabricJS 进行像素操作

Pixel manipulation with FabricJS

我正在使用 FabricJS v1.5.0,在 canvas 上逐像素操作时遇到问题。

this.canvas = new this.fabric.Canvas('canvas');
let imageData = this.canvas.contextContainer.getImageData(0, 0, this.canvas.getWidth(), this.canvas.getHeight());
//here a changed imageData

this.canvas.contextContainer.putImageData(imageData, 0, 0);
//data seted in canvas.

let imageAdd = new this.fabric.Image(image, {
          left: 100,
          top: 100,
          width: 100,
          height: 100
        });
this.canvas.add(imageAdd).setActiveObject(imageAdd);
//in this moment, the canvas don't have more the imageData setted

为什么要添加image clear imageData?我需要转换 FabricJS 对象中的 imageData 以添加 canvas?

是的,我认为您确实需要将图像数据转换为 fabricjs 图像。当你需要保存 canvas 的状态时,你可以这样做:

var dataUrl;
....
// Save canvas state
dataUrl = canvas.toDataURL()

// Make changes to the canvas

然后当您需要从 canvas 的保存状态恢复时:

var img = fabric.Image.fromURL(dataUrl, function (i) {
    canvas.clear();
    canvas.add(i);
    canvas.renderAll();
});

然后您应该可以像以前一样添加其他图像。

您需要查明您的 image 是否真的是图像对象,因为 fabric.Image() 需要您的图像对象。

如果您的图像是 URL 或 Blob 格式(我猜是),您需要使用 fabric.Image.fromURL() 并提供图像的 src 而不是整个图片对象。

这是一个关于如何从 URL 字符串

创建 fabric.Image 实例的示例
fabric.Image.fromURL(link, function(img) {
    img.set({
        id : 'someId',
        width : canvas.width / 2,
        height : canvas.height / 2
    });
    canvas.add(img).renderAll().setActiveObject(img);
});