Я хочу реализовать ctrl + c событие в холсте (например, в художниках) из выбранного региона в буфер OS. На основании этого ответа я могу добавить copy
слушателя и изменение данных в буфер обмена там - который прекрасно работает с текстом. Но я не могу найти, как разместить ImageData
объект Image
/ImageData
. Здесь MDD копирует документацию и setData. Похоже, что в формате image/*
ничего нет. Спецификация скважины ничего не говорит. Но я чувствую запах, если первый параметр, названный как format
в setData
должен быть способ разместить файл там.
Здесь, где я зашел так далеко:
document.addEventListener('copy', function(e) {
var data = ctx.getImageData(params.left, params.top, params.width, params.height);
var file = new File(data.data, "file.png", {type: "image/png"});
e.clipboardData.items.add(file, 'image/png'); // This doesn't work, But it create the structure like on the image below(with items and types, but without FileList)
e.clipboardData.setDragImage(tool.img, 10, 10); // doesn't work
e.clipboardData.setData("image/png", tool.file); // doesn't work
e.preventDefault();
})
Я также нашел метод setDragImage, я его реализовал, но после размещения Image
он не появляется в буфере.
НОТА:
Когда я вставляю изображение из буфера обмена, мое событие "вставить" показывает структуру событий, как на изображении ниже, поэтому, я думаю, мне нужно создать что-то подобное.
Есть идеи?
ps Я также знаю о document.execCommand('copy'); , но он не работает в хроме (по крайней мере, в моем случае), поэтому я не хочу его использовать.
Говоря только из моих наблюдений и исследований:
Chrome не поддерживает тип "image/png"
, и это не формат, который требуется спецификацией API буфера обмена. (Ошибка Chrome.)
Firefox по крайней мере попытается поместить DataTransferItem с типом "image/png"
в буфер обмена, но я еще не понял, какой формат данных использовать. (Base64 PNG, с или без data:image/png;base64,
prefix, не работает, чтобы вставлять в PowerPoint и не использовать atob(<the base64 PNG without prefix>)
, насколько я экспериментировал.)
"text/html"
требуется. Когда событие copy
запускается в Документах Google, оно, как представляется, загружает изображение, а затем помещает фрагмент HTML в буфер обмена, который выглядит так:
<meta charset="utf-8">
<b style="font-weight:normal;" id="docs-internal-guid-abcdefg-abcd-abcd">
<img src="https://lh4.googleusercontent.com/a-very-long-identifier" width="659px;" height="312px;" />
</b>
используя evt.clipboardData.setData("text/html", fragment)
. Затем, например, приложения Microsoft Office загружают это изображение и вставляют его в документ. Я не знаю, делает ли он то же самое в MacOS или Linux. URI данных, кстати, не работают как img
src
.