javascript - 将剪贴板中的图像粘贴到fabric.js Canvas 上?

标签 javascript jquery canvas fabricjs clipboard

我正在尝试创建一个函数,将用户剪贴板中的图像作为 new Fabric.Image() 粘贴到 Canvas 上。我发现的任何搜索结果都描述了 Canvas 上已有的克隆对象或粘贴 IText 数据。这个SO问题与我要问的内容相关,但它已经有4年历史了,并且顶部答案中的功能不起作用:

How to do Copy and paste the image from User system to Canvas using fabric.js

这是我当前正在尝试使用的代码。我正在尝试设置一个稍后可以调用的粘贴函数:

var $wrapper = $('#content'), 
  canvas = new fabric.Canvas('canvas', {
    width: 400,
    height: 550
  }),
pasteImage = function (e) {
    var items=e.originalEvent.clipboardData.items;

    e.preventDefault();
    e.stopPropagation();

    // Fabric.js image function
    function canvasImage(url) {
      var img = new fabric.Image(url);
      img.scale(0.75).center().setCoords();
      canvas.add(img).renderAll();
    }

    //Loop through files
    for(var i=0;i<items.length;i++){
      var file = items.items[i],
          type = file.type;

      if (type.indexOf("image")!=-1) {
        var imageData = file.getAsFile();
        var imageURL=window.webkitURL.createObjectURL(imageData);
        canvasImage(imageURL);
      }
    }
  };
$wrapper.on('paste', pasteImage);

Here's a fiddle看到它在行动(或不行动,我猜)。这最终将成为 Photoshop 插件的一部分,所以幸运的是我只需要担心它在 Chrome 中的工作情况。

最佳答案

我无法触发您的粘贴事件处理程序,因为我不确定 div 是否可以 native 获取过去的事件,除非您将其设为可内容编辑的 div,在您的用例中我怀疑您想要这样做。

我最近刚刚在自己的应用程序中实现了这个,但我没有使用 Fabric,只是使用原生 Canvas 和 js。

您将不得不重新编写代码,但请尝试更改

$wrapper.on('paste', pasteImage);

$(window).on('paste', pasteImage);

无论如何,我修改了您当前的代码,这就是我要做的工作,尽管它可能不会完全触发您的设置,但它将图像粘贴到:

(function() {
  var $wrapper = $('#content'), 
      canvas = new fabric.Canvas('canvas', {
        width: 400,
        height: 550
      }),
      txtStyles = {
        top: 100,
        left: 200,
        padding: 6,
        fill: '#d6d6d6',
        fontFamily: 'sans-serif',
        fontSize: '24',
        originY: 'center',
        originX: 'center',
        borderColor: '#d6d6d6',
        cornerColor: '#d6d6d6',
        cornerSize: 5,
        cornerStyle: 'circle',
        transparentCorners: false,
        lockUniScaling: true
      },
      imgAttrs = {
        left: 200,
        top: 200,
        originY: 'center',
        originX: 'center',
        borderColor: '#d6d6d6',
        cornerColor: '#d6d6d6',
        cornerSize: 5,
        cornerStyle: 'circle',
        transparentCorners: false,
        lockUniScaling: true
      },
      introTxt = new fabric.Text('Paste images here', txtStyles),
      pasteImage = function (e) {
        var items=e.originalEvent.clipboardData.items;

        e.preventDefault();
        e.stopPropagation();

        //Loop through files
        for(var i=0;i<items.length;i++){
          if (items[i].type.indexOf('image')== -1) continue;
          var file = items[i],
              type = items[i].type;
          var imageData = file.getAsFile();
          var URLobj = window.URL || window.webkitURL;
          var img = new Image();
          img.src = URLobj.createObjectURL(imageData);
          fabric.Image.fromURL(img.src, function(img){
            canvas.add(img);
          });
        }
      },

      //Canvas starter text
      introCanvas = function() {
        canvas.add(introTxt);
      };

  introCanvas();
  $(window).on('paste', pasteImage);
})();

fiddler :https://jsfiddle.net/c0kw5dbu/3/

关于javascript - 将剪贴板中的图像粘贴到fabric.js Canvas 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48108696/

相关文章:

javascript - 哪个 Java Web 框架允许跨域 Javascripting(http 代理)?

javascript - 检查复选框是否被选中添加值如果未选中则删除值

javascript - JQuery 使用计时器在 for 循环中更改 CSS

Javascript/Jquery 幻灯片效果发生在错误的位置

javascript - 从多个 Canvas 制作图像

javascript - Cypress - 包含文本和字符串结尾的属性

javascript - 如果有人手动尝试在 angularjs 中访问网站的不同网址,如何重定向回同一页面(他已经所在的页面)

javascript - 是否有一个好的图表 API 可以在滚动/缩放时使用 Ajax 延迟加载大型数据集?

javascript - 在 Canvas 上使用 createPattern()

javascript - 图像比 Canvas 上的原始图像小以制作drawImage()