I\'ve created an image from my canvas object by using canvas.toDataURL(\"image/png\", 0.7)
. It works fine to save the image from the context menu but it doesn\'
You can convert the canvas to img
, put in inside a <div contenteditable>
, select it and copy it.
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);
The SelectText function is from https://stackoverflow.com/a/40547470/1118626
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);
}
}
Clipboard API for images are now available on chrome
https://github.com/web-platform-tests/wpt/tree/master/clipboard-apis
const item = new ClipboardItem({ "image/png": blob });
navigator.clipboard.write([item]);
Example
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]);
});
Much easier 1 liner:
Assuming u have a canvas.
The following code will copy the canvas (as blob --> PNG image) to your clipboard.
canvas.toBlob(blob => navigator.clipboard.write([new ClipboardItem({'image/png': blob})]));
Today 4 years later, it's the most starred issue in Google Chrome. To copy images using JavaScript. And now it's possible!
Chrome 76 Beta supports it: https://blog.chromium.org/2019/06/chrome-76-beta-dark-mode-payments-new.html
You can read the full draft here: https://www.chromestatus.com/feature/5074658793619456
and here: https://w3c.github.io/clipboard-apis/#async-clipboard-api
Example:
var data = new Blob(["iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg=="], {type : "image/png"});
const clipboardItemInput = new ClipboardItem({'image/png' : blobInput});
await navigator.clipboard.write([clipboardItemInput]);
You can test it here: http://w3c-test.org/clipboard-apis/async-write-image-read-image-manual.https.html
(Now it support only Chrome 76 beta)
More info: The draft document [contain examples]: https://docs.google.com/document/d/1lpi3-9vBP_1b7hZc2xBs0s_HaACJ6UigZZqHlJSNeJg/edit#heading=h.do75bvtsde7a