У меня есть элемент холста с рисунком в нем, и я хочу создать кнопку, которая при нажатии сохранит изображение как файл png. Таким образом, он должен открыть диалоговое окно сохранения, открытия, закрытия ...
Я делаю это с помощью этого кода
var canvas = document.getElementById("myCanvas");
window.open(canvas.toDataURL("image/png"));
Но когда я тестирую его в IE9, открывается новое окно с сообщением «веб-страница не может быть отображена» и его URL-адрес:
данные: изображение / png; base64,iVBORw0KGgoAAAANSUhEUgAAAmAAAABpCAYAAACd + 58xAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAADRwSURBVHhe7V0HgBVF0q7ZJSlJwRxAPUFRD39RFLN34qGnnomoqIjhzBlFPROIgsoZzogR5AQEzJ4BPFAUEUwgJjgQkCQKooggaf / 6el6 / 6ZnpSW / zUn237u5MdXX1172 + z6rqaqeEG6VsJet + PDW / vkdrfx3H3yfT2tVzaP26X6hkw1q / Boei / 280 / 29JwznZxJPUyXtBQBAQBAQBQaBcECjefmi56BWlZYtAeqajx / WokfrJYEqOIikOFRfXoVq161PtOk2odu0t + ectqKiojnrntWhC46QhYOtXfUarl79Ivy9 / ldau + Н + Тх / 8b2SbjJ07pWFQy2Uqnp2yXSrQJAoKAICAICALJCAgBS8ao8iTi / UvpSZlBxiwqwWOKimsxCWtEdettR3XqbEfFtRonkrBYArZh3fe0 + senadWyEbRm1UzasP53K45ZiFc84RKyVXkbVUYWBAQBQUAQyIqAELCsiFW2fDQpSyZk8UQMMysqKmaPWCOqt8mOVK / eTuQU1YuccCQBW7dyIq38 / j5a / дг / ad3a5QGXmqsvLfGKJl0ZCFdONEOPyl5lGV8QEAQEAUGghiMgBKzqLHCeHqVOrILtduF4MpZExEqoVq167A3bmjap34J / bmoFqcj2dM3Pr9GK + b1p5bJXmXz9nEC + 3FiorYF4hcmXlo + gUrk + um / + e + QoVWfxxRJBQBAQBAQBQUAQqBwE8uzCwiMiaEqOWYR5jJ2 / 6Hl58nYHk0Pr1v1Ov62cTytXfE5r1yyyc6RgD16 + L + tLqFZ9xnteGUKc0Xi876YpYkFDCfpqFEz9YGpRERhAQBAQBQaB8ERAPWPnim157JreX6 / eK7eJ / Ge0RS8oPc9gT1pTqN2jFocltfdPxecBU2HHxgBTky + 71CjPGCO + YyU4j0TU9ZcGf0y + JSAoCgoAgIAgIAoJATUcgG2dQ0jpKZ / Xp + PlLtEcs3huGQhO / r17K3rBvuGrEUt8i5HPAkHC / Yt6lKuwYKiuRM9TtGbY0rcerTBLwC / KY1fSNJ / MTBAQBQUAQqAwExANWGaiHx0z2aJl9CknET + MRc2XsVSKKaNP6O1CDhvtwYn5dJZf3gOG0IxLuS0e + LB4vw9sVhiwmHywmF6xqLLdYIQgIAoKAICAICAJVAQHTo2XmkNtzv6K5R7RXLOwRs3MaW + 47SNkG9oRxZQmun6qbImCo84VSE + 5pR3 / zvFZJni / 7e8tTHiCeqCkAqsKKig2CgCAgCAgCgoAgUG0RCBKzMLmwkzHdL4pk4XlUAn7Uu3XrVtPqVfO4lurPSq0KQa5cdAv9snBgqM5XFPlKSsSPM8o3mcxES2hZtf0rEMMFAUFAEKiBCEgIsqotavpk / OiwZViHPQk / LgHfHo5EnbCGjVpxeYo9yNmw9oeSn2YeTatWTPNzozzX8ZOeWPJlJVRJnrOoxUtJtmLEUmqoartH7BEEBAFBQBCoJggIASu / hUqkUokC2rZkwSSCBU12wpadhNXbpAk13vwwKlJ3O / L1QmYrxPNlDxuGyVtyIn6K8KSZHwY3XsRX + W0L0VyTEPjwM6KuFxN1uiB6Vkv48MpdjxLt9ieieQvscuvWE13eh2jnQ9zv + F2aICAICAKCQGEIRH22559H5IqnDTMGeU / SgUJ7WNLjOVH9g8 / Xrv2Fa4P9SM6K7y4t + WXRw76sfVc42fPV936iJ5 + LKrbqTU0P3rA + 0dZbEh20L9HJHYj23I2oVrHFT5U5NFnY4m6svUA0Pvo8efbvjCBqtr0nN + IVot4Dkvv1v5aoy / HJcpUpsfI3olffdknV0uWuJfv9kWjkw55VIFAfM073PE4EkqZbEBf9HMTs8C6e3KhHiPbdqzJnKWMLAoJAeSMgHrDyRrj0 + rOEGvVoYY9Y0inIeE + YQQ + cqGGj3dgDtvJjC / mKm7BHmG68lGjO + 0T
Кто-нибудь знает, как это исправить?
источник
Ответы:
попробуй это:
var c=document.getElementById("alpha"); var d=c.toDataURL("image/png"); var w=window.open('about:blank','image from canvas'); w.document.write("<img src='"+d+"' alt='from canvas'/>");
Это показывает изображение с холста на новой странице, но если вы
open popup in new tab
установили его, отображаетсяabout:blank
в адресной строке.EDIT: - хотя
window.open("<img src='"+ c.toDataURL('image/png') +"'/>")
не работает в FF или Chrome, следующие работы, хотя рендеринг несколько отличается от того, что показано на холсте, я думаю, что проблема заключается в прозрачности:window.open(c.toDataURL('image/png'));
источник
FileSaver.js может вам здесь помочь.
var canvas = document.getElementById("my-canvas"); // draw to canvas... canvas.toBlob(function(blob) { saveAs(blob, "pretty image.png"); });
источник
Я использовал это решение, чтобы установить имя файла :
HTML:
<a href="#" id="downloader" onclick="download()" download="image.png">Download!</a> <canvas id="canvas"></canvas>
JavaScript:
function download(){ document.getElementById("downloader").download = "image.png"; document.getElementById("downloader").href = document.getElementById("canvas").toDataURL("image/png").replace(/^data:image\/[^;]/, 'data:application/octet-stream'); }
источник
У меня была эта проблема, и это лучшее решение без каких-либо внешних или дополнительных библиотек сценариев: В тегах Javascript или файле создайте эту функцию: здесь мы предполагаем, что холст - это ваш холст:
function download(){ var download = document.getElementById("download"); var image = document.getElementById("canvas").toDataURL("image/png") .replace("image/png", "image/octet-stream"); download.setAttribute("href", image); }
В основной части вашего HTML укажите кнопку:
<a id="download" download="image.png"><button type="button" onClick="download()">Download</button></a>
Это работает, и ссылка для скачивания выглядит как кнопка. Проверено в Firefox и Chrome.
источник
Чтобы учесть все три точки:
Диалог файла - это настройка в браузере.
Для части кнопки / сохранения назначьте следующую функцию, взятую из других ответов, вашим кнопкам onclick:
function DownloadCanvasAsImage(){ let downloadLink = document.createElement('a'); downloadLink.setAttribute('download', 'CanvasAsImage.png'); let canvas = document.getElementById('myCanvas'); let dataURL = canvas.toDataURL('image/png'); let url = dataURL.replace(/^data:image\/png/,'data:application/octet-stream'); downloadLink.setAttribute('href', url); downloadLink.click(); }
Пример на Codepen
Другой, несколько более чистый подход - использование Canvas.toBlob () :
function DownloadCanvasAsImage(){ let downloadLink = document.createElement('a'); downloadLink.setAttribute('download', 'CanvasAsImage.png'); let canvas = document.getElementById('myCanvas'); canvas.toBlob(function(blob) { let url = URL.createObjectURL(blob); downloadLink.setAttribute('href', url); downloadLink.click(); }); }
Пример на Codepen
Ни одно из решений не на 100% кроссбраузерно, поэтому проверьте клиента.
источник
Возможно, я нашел лучший способ не заставлять пользователя щелкать правой кнопкой мыши и «сохранять изображение как». В реальном времени нарисуйте код base64 холста в
href
ссылке и измените его, чтобы загрузка началась автоматически. Я не знаю, совместим ли он с универсальным браузером, но он должен работать с основными / новыми браузерами .var canvas = document.getElementById('your-canvas'); if (canvas.getContext) { var C = canvas.getContext('2d'); } $('#your-canvas').mousedown(function(event) { // feel free to choose your event ;) // just for example // var OFFSET = $(this).offset(); // var x = event.pageX - OFFSET.left; // var y = event.pageY - OFFSET.top; // standard data to url var imgdata = canvas.toDataURL('image/png'); // modify the dataUrl so the browser starts downloading it instead of just showing it var newdata = imgdata.replace(/^data:image\/png/,'data:application/octet-stream'); // give the link the values it needs $('a.linkwithnewattr').attr('download','your_pic_name.png').attr('href',newdata); });
Вы можете обернуть
<a>
вокруг все, что захотите.источник
Попробуй это:
jQuery('body').after('<a id="Download" target="_blank">Click Here</a>'); var canvas = document.getElementById('canvasID'); var ctx = canvas.getContext('2d'); document.getElementById('Download').addEventListener('click', function() { downloadCanvas(this, 'canvas', 'test.png'); }, false); function downloadCanvas(link, canvasId, filename) { link.href = document.getElementById(canvasId).toDataURL(); link.Download = filename; }
Вы можете просто поместить этот код в консоль в Firefox или Chrome, а затем изменить свой идентификатор тега холста в этом сценарии выше и запустить этот сценарий в консоли.
После выполнения этого кода вы увидите ссылку в виде текста «щелкните здесь» внизу страницы html. щелкните по этой ссылке и откройте рисунок холста как изображение PNG в новом окне, сохраните изображение.
источник
Отправьте форму, которая содержит ввод со значением холста toDataURL ('image / png'), например
// JAVASCRIPT
var canvas = document.getElementById("canvas"); var url = canvas.toDataUrl('image/png');
Вставьте значение URL-адреса в скрытый ввод в элементе формы.
// PHP
$data = $_POST['photo']; $data = str_replace('data:image/png;base64,', '', $data); $data = base64_decode($data); file_put_contents("i". rand(0, 50).".png", $data);
источник
canvas.toDataUrl(...)
должна бытьcanvas.toDataURL(...)
.Полный рабочий HTML-код . Вырезать + вставить в новый файл .HTML:
Содержит два примера:
Проверено в:
источник
Мне очень нравится ответ Товаска, но он не работает из-за функции, имеющей имя
download
( этот ответ объясняет, почему). Я тоже не вижу смысла заменять «data: image / ...» на «data: application / ...».Следующий код был протестирован в Chrome и Firefox и работает нормально в обоих.
JavaScript:
function prepDownload(a, canvas, name) { a.download = name a.href = canvas.toDataURL() }
HTML:
<a href="#" onclick="prepDownload(this, document.getElementById('canvasId'), 'imgName.png')">Download</a> <canvas id="canvasId"></canvas>
источник
var canvasId = chart.id + '-canvas'; var canvasDownloadId = chart.id + '-download-canvas'; var canvasHtml = Ext.String.format('<canvas id="{0}" width="{1}" height="{2}"></canvas><a id="{3}"/>', canvasId, chart.getWidth(), chart.getHeight(), canvasDownloadId); var canvasElement = reportBuilder.add({ html: canvasHtml }); var canvas = document.getElementById(canvasId); var canvasDownload = document.getElementById(canvasDownloadId); canvasDownload.href = chart.getImage().data; canvasDownload.download = 'chart'; canvasDownload.click();
источник