将图像从剪贴板粘贴到 fabric.js canvas?
Paste image from clipboard to fabric.js canvas?
我正在尝试创建一个函数,将用户剪贴板中的图像作为 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 是否可以本机获取过去的事件,除非您将其设为可满足的 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);
})();
我正在尝试创建一个函数,将用户剪贴板中的图像作为 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 是否可以本机获取过去的事件,除非您将其设为可满足的 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);
})();