【问题标题】:Paste image from clipboard to fabric.js canvas?将图像从剪贴板粘贴到 fabric.js 画布?
【发布时间】:2018-06-14 23:25:57
【问题描述】:

我正在尝试创建一个函数,将图像从用户剪贴板粘贴到画布上作为new fabric.Image()。我找到的任何搜索结果要么描述了画布上已有的克隆对象,要么描述了粘贴 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 中的工作。

【问题讨论】:

    标签: javascript jquery canvas fabricjs clipboard


    【解决方案1】:

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

    我最近刚刚在自己的应用程序中实现了这一点,但我没有使用织物,只是使用原生画布和 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);
    })();
    

    提琴手:https://jsfiddle.net/c0kw5dbu/3/

    【讨论】:

    • 不要放两个答案,edit你的旧答案,并更新它。
    • 旧答案高度相关,并且只是一个子答案。如果 OP 希望使 div 内容可编辑,那么这个答案将不可行,这就是为什么我做了 2 个单独的答案。
    • 不用了,合一个吧。
    • 我复制了其他答案并放在前面,因为它高度相关。
    • ALso @gesturepoke 我不认为 imgAttrs 正在被应用。您可能需要进一步修改它,因为我不知道结构库的工作原理,但这绝对应该为您指明某种方向。
    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2010-11-10
    • 2013-12-06
    • 2013-02-21
    相关资源
    最近更新 更多