如何使用Fabric.js将图像上传到画布?

18

我希望创建一个流程,使用户可以上传他们的图片,并在浏览器中使用Fabric.js中的一些按钮在Canvas上编辑它们,这些按钮使用Fabric.js添加一些效果。

但我无法使其工作。我的HTML代码如下:

<form id="uploadImg" runat="server">
  <input type="file" id="uploadedImg"/>
</form>
<canvas id="canvas"></canvas>

以下是 JavaScript 代码:

var canvas = new fabric.Canvas('canvas');
canvas.setHeight(480);
canvas.setWidth(640);

$('#uploadedImg').change(function () {
    var imgData = $(this).files[0];
    fabric.util.loadImage(imgData, function(img) {
        var oImg = new fabric.Image(img);
        oImg.scale(0.2).set({
            left: 100,
            top: 100,
        });
    canvas.add(oImg);
    });
}); 

刚在这里找到了一个带有可行示例的答案:https://dev59.com/f2_Xa4cB1Zd3GeqPyz2V - user1230041
4个回答

25
document.getElementById('imgLoader').onchange = function handleImage(e) {
var reader = new FileReader();
  reader.onload = function (event){
    var imgObj = new Image();
    imgObj.src = event.target.result;
    imgObj.onload = function () {
      var image = new fabric.Image(imgObj);
      image.set({
            angle: 0,
            padding: 10,
            cornersize:10,
            height:110,
            width:110,
      });
      canvas.centerObject(image);
      canvas.add(image);
      canvas.renderAll();
    }
  }
  reader.readAsDataURL(e.target.files[0]);
}

2
谢谢,这段代码运行良好。但是当我连续尝试上传相同的图像时,第二次就无法上传了。 - Nikunj Chavda
1
@NikunjChavda 如果要上传相同的图像,则需要清除input[type="file"]元素的值。类似于e.target.value = null; - codekipple

20

您可以通过fabric js上传多张图片,并将其拖动到画布中的另一个位置。

var canvas = new fabric.Canvas('canvas');
document.getElementById('file').addEventListener("change", function (e) {
  var file = e.target.files[0];
  var reader = new FileReader();
  reader.onload = function (f) {
    var data = f.target.result;                    
    fabric.Image.fromURL(data, function (img) {
      var oImg = img.set({left: 0, top: 0, angle: 0,width:100, height:100}).scale(0.9);
      canvas.add(oImg).renderAll();
      var a = canvas.setActiveObject(oImg);
      var dataURL = canvas.toDataURL({format: 'png', quality: 0.8});
    });
  };
  reader.readAsDataURL(file);
});
canvas{
  border: 1px solid black;
}


Include it like this:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/kangax/fabric.js/master/dist/fabric.min.js"></script>
<input type="file" id="file"><br />
<canvas id="canvas" width="450" height="450"></canvas>


6

这是一个老问题,这里的一些答案似乎已经失效。以下是一个可以使用文件输入向Fabric.js画布添加图像,并将其缩放以适合画布大小的工作示例。

此示例适用于当前版本的库。

var canvas = new fabric.Canvas('canvas');

document.getElementById("uploader").onchange = function(e) {
  var reader = new FileReader();
  reader.onload = function(e) {
    var image = new Image();
    image.src = e.target.result;
    image.onload = function() {
      var img = new fabric.Image(image);
      img.set({
        left: 100,
        top: 60
      });
      img.scaleToWidth(200);
      canvas.add(img).setActiveObject(img).renderAll();
    }
  }
  reader.readAsDataURL(e.target.files[0]);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/4.5.0/fabric.min.js"></script>
<input id="uploader" type="file"/>
<canvas id="canvas" width="400" height="300" style="border:1px solid black"></canvas>


谢谢您给予的更新回应。您如何在上传图像之后初始化画布呢?也就是说,画布应该由上传的图像宽度和高度创建。我需要保留图像的原始尺寸,并通过fabricjs对图像进行进一步调整。 - emre-ozgun

0
 var canvas = new fabric.Canvas('main-canvas');
        canvas.selection = false;
        var imgElement = document.getElementById("img11");

        var imgInstance = new fabric.Image(imgElement, {
            angle: 0,
            position: 'absolute',
            opacity: 1,
            originX: 'left',
            originY:'top',
            meetOrSlice:'slice',

        });
        imgInstance.selectable = false;
        canvas.add(imgInstance);
        canvas.renderAll();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接