本文概述
- 将图像检索为Blob
- 检索图像为base64
- 例子
注意该事件只能由用户对文档的操作(即按CTRL + V)触发。
window.addEventListener("paste", function(thePasteEvent){// Use thePasteEvent object here ...}, false);
当你按CTRL + V并且当前窗口处于焦点状态时, 将触发此事件。对于你而言重要的是包含剪贴板数据对象的thePasteEvent对象(在回调中作为参数接收的参数)。如果剪贴板数据对象存在, 则它将包含items属性(如果剪贴板为空, 默认情况下为undefined):
var items = pasteEvent.clipboardData.items;
Items是一个包含剪贴板数据的数组, 因此你只需要遍历它。如果剪贴板上有图像, 则可以将内容转换为包含类似于以下内容的文件(Blob):
{name: "image.png", lastModified: 1499172701225, lastModifiedDate: Tue Jul 04 2017 14:51:41 GMT+0200 (W. Europe Daylight Time), webkitRelativePath: "", size: 158453, type:"image/png", webkitRelativePath:""}
如果要在浏览器中显示图像或将其发送到服务器等, 则需要检索该对象。在我们提供的从剪贴板轻松检索图像的方法中, 你需要提供thePasteEvent作为事件的第一个参数, 否则它们将不起作用。
在本文中, 我们将说明从剪贴板获取图像的过程如何工作以及如何以Blob或Base64格式检索图像。
将图像检索为Blob从剪贴板检索图像的最简单方法是使用Blob格式(作为文件)。以下方法期望将pasteEvent作为第一个参数, 并将回调作为第二个参数, 该图像接收图像的Blob作为第一个且唯一的参数:
/** * This handler retrieves the images from the clipboard as a blob and returns it in a callback. * * @param pasteEvent * @param callback */function retrieveImageFromClipboardAsBlob(pasteEvent, callback){ if(pasteEvent.clipboardData =http://www.srcmini.com/= false){if(typeof(callback) =="function"){callback(undefined);
}};
var items = pasteEvent.clipboardData.items;
if(items == undefined){if(typeof(callback) == "function"){callback(undefined);
}};
for (var i = 0;
i <
items.length;
i++) {// Skip content if not imageif (items[i].type.indexOf("image") == -1) continue;
// Retrieve image on clipboard as blobvar blob = items[i].getAsFile();
if(typeof(callback) == "function"){callback(blob);
}}}
然后可以按以下方式使用它, 例如在文档的画布中显示Blob:
<
canvas style="border:1px solid grey;
" id="mycanvas">
<
script>
window.addEventListener("paste", function(e){// Handle the eventretrieveImageFromClipboardAsBlob(e, function(imageBlob){// If there's an image, display it in the canvasif(imageBlob){var canvas = document.getElementById("mycanvas");
var ctx = canvas.getContext('2d');
// Create an image to render the blob on the canvasvar img = new Image();
// Once the image loads, render the img on the canvasimg.onload = function(){// Update dimensions of the canvas with the dimensions of the imagecanvas.width = this.width;
canvas.height = this.height;
// Draw the imagectx.drawImage(img, 0, 0);
};
// Crossbrowser support for URLvar URLObj = window.URL || window.webkitURL;
// Creates a DOMString containing a URL representing the object given in the parameter// namely the original Blobimg.src = http://www.srcmini.com/URLObj.createObjectURL(imageBlob);
}});
}, false);
<
/script>
另外, 你可以根据需要使用Blob, 这只是一个示例。
检索图像为base64默认情况下, retrieveImageFromClipboard方法返回一个Blob(不可变的原始数据的类似文件的对象)。作为一种变通方法, 如果你需要检索base64格式的图像, 则可以改用以下函数(与原始函数几乎相同), 该函数从blob创建DOM字符串并将其设置为来自将要生成的图像的源。渲染到画布上。作为最后一步, 一旦图像加载到抽象画布上(它将不可见), 回调将以base64格式返回图像:
/** * This handler retrieves the images from the clipboard as a base64 string and returns it in a callback. * * @param pasteEvent * @param callback */function retrieveImageFromClipboardAsBase64(pasteEvent, callback, imageFormat){ if(pasteEvent.clipboardData =http://www.srcmini.com/= false){if(typeof(callback) =="function"){callback(undefined);
}};
var items = pasteEvent.clipboardData.items;
if(items == undefined){if(typeof(callback) == "function"){callback(undefined);
}};
for (var i = 0;
i <
items.length;
i++) {// Skip content if not imageif (items[i].type.indexOf("image") == -1) continue;
// Retrieve image on clipboard as blobvar blob = items[i].getAsFile();
// Create an abstract canvas and get contextvar mycanvas = document.createElement("canvas");
var ctx = mycanvas.getContext('2d');
// Create an imagevar img = new Image();
// Once the image loads, render the img on the canvasimg.onload = function(){// Update dimensions of the canvas with the dimensions of the imagemycanvas.width = this.width;
mycanvas.height = this.height;
// Draw the imagectx.drawImage(img, 0, 0);
// Execute callback with the base64 URI of the imageif(typeof(callback) == "function"){callback(mycanvas.toDataURL((imageFormat || "image/png")));
}};
// Crossbrowser support for URLvar URLObj = window.URL || window.webkitURL;
// Creates a DOMString containing a URL representing the object given in the parameter// namely the original Blobimg.src = http://www.srcmini.com/URLObj.createObjectURL(blob);
}}
它可以如下使用:
window.addEventListener("paste", function(e){// Handle the eventretrieveImageFromClipboardAsBase64(e, function(imageDataBase64){// If there's an image, open it in the browser as a new window :)if(imageDataBase64){// data:image/png;
base64, iVBORw0KGgoAAAAN......window.open(imageDataBase64);
}});
}, false);
例子在以下小提琴上测试一个实时示例:
【如何使用浏览器中的JavaScript从剪贴板检索图像】编码愉快!
推荐阅读
- 如何在Windows中使用pyinstaller从Python脚本创建可执行文件(.exe)
- 如何使用JavaScript将PDF转换为文本(从PDF提取文本)
- 使用浏览器工具或创建自己的基准来使用JavaScript衡量功能的性能
- 如何在浏览器中使用JavaScript创建Gameboy Advance Emulator(GBA)
- Linux(内核剖析):09---进程调度之Linux调度的实现(struct sched_entityschedule())
- Linux(内核剖析):08---进程调度之Linux调度算法(调度器类公平调度(CFS))
- helm v3 在k8s 上面的部署skywalking
- 服务/软件管理(19---Linux与Windows之间Zmodem协议的开启与使用(rzsz命令))
- Linux(内核剖析):06---进程之线程的实现