是否可以将画布图像复制到剪贴板?

gus*_*per 5 html javascript html5 canvas image

我已经使用创建了来自我的canvas对象的图像canvas.toDataURL("image/png", 0.7)。从上下文菜单保存图像效果很好,但是将图像复制到剪贴板并将其粘贴到邮件或Word文档中则无效。是否有可能使“复制到剪贴板”的行为与“正常”图像的行为相同?

我正在考虑创建一个小型服务器组件,该组件可以采用图像的base64表示形式并返回“正常” png图像,可以将其复制到剪贴板。这可以作为解决方法吗?

编辑: 澄清:我正在使用canvas.toDataURL("image/png", 0.7)画布创建图像,然后将标签的src属性设置img为结果。然后,当我右键单击图像时,可以从上下文菜单中选择“复制图像”。然后的问题是我无法将图像粘贴到Word和电子邮件中(至少是Outlook)。粘贴到Wordpad和mspaint可以正常工作。

小智 13

用于图像的剪贴板 API 现在可在 chrome 上使用

https://github.com/web-platform-tests/wpt/tree/master/clipboard-apis

const item = new ClipboardItem({ "image/png": blob });
navigator.clipboard.write([item]); 
Run Code Online (Sandbox Code Playgroud)

例子

const canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
document.body.appendChild(canvas);
const ctx = canvas.getContext("2d");
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "#eee";
ctx.fillRect(10, 10, 50, 50);

//tested on chrome 76
canvas.toBlob(function(blob) { 
    const item = new ClipboardItem({ "image/png": blob });
    navigator.clipboard.write([item]); 
});
Run Code Online (Sandbox Code Playgroud)


df1*_*df1 5

您可以将画布转换为img,放入 a 中<div contenteditable>,选择它并复制它。

var img = document.createElement('img');
img.src = canvas.toDataURL()

var div = document.createElement('div');
div.contentEditable = true;
div.appendChild(img);
document.body.appendChild(div);

// do copy
SelectText(div);
document.execCommand('Copy');
document.body.removeChild(div);
Run Code Online (Sandbox Code Playgroud)

SelectText 函数来自/sf/answers/2838322931/

function SelectText(element) {
    var doc = document;
    if (doc.body.createTextRange) {
        var range = document.body.createTextRange();
        range.moveToElementText(element);
        range.select();
    } else if (window.getSelection) {
        var selection = window.getSelection();
        var range = document.createRange();
        range.selectNodeContents(element);
        selection.removeAllRanges();
        selection.addRange(range);
    }
}
Run Code Online (Sandbox Code Playgroud)