Tengo un elemento de lienzo con un dibujo y quiero crear un botón que, al hacer clic en él, guardará la imagen como un archivo png. Por lo tanto, debería abrir el cuadro de diálogo guardar, abrir, cerrar ...
Lo hago usando este código
var canvas = document.getElementById("myCanvas");
window.open(canvas.toDataURL("image/png"));
Pero cuando lo pruebo en IE9, se abre una nueva ventana que dice "la página web no se puede mostrar" y la URL es:
datos: imagen / png; base64,iVBORw0KGgoAAAANSUhEUgAAAmAAAABpCAYAAACd + 58xAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAADRwSURBVHhe7V0HgBVF0q7ZJSlJwRxAPUFRD39RFLN34qGnnomoqIjhzBlFPROIgsoZzogR5AQEzJ4BPFAUEUwgJjgQkCQKooggaf / 6el6 / 6ZnpSW / zUn237u5MdXX1172 + z6rqaqeEG6VsJet + pDW / vkdrfx3H3yfT2tVzaP26X6hkw1q / Boei / 280 / 29JwznZxJPUyXtBQBAQBAQBQaBcECjefmi56BWlZYtAeqajx / WokfrJYEqOIikOFRfXoVq161PtOk2odu0t + ectqKiojnrntWhC46QhYOtXfUarl79Ivy9 / ldau + h + TX / 8b2SbjJ07pWFQy2Uqnp2yXSrQJAoKAICAICALJCAgBS8ao8iTi / UvpSZlBxiwqwWOKimsxCWtEdettR3XqbEfFtRonkrBYArZh3fe0 + senadWyEbRm1UzasP53K45ZiFc84RKyVXkbVUYWBAQBQUAQyIqAELCsiFW2fDQpSyZk8UQMMysqKmaPWCOqt8mOVK / eTuQU1YuccCQBW7dyIq38 / J5A / fN / ad3a5QGXmqsvLfGKJl0ZCFdONEOPyl5lGV8QEAQEAUGghiMgBKzqLHCeHqVOrILtduF4MpZExEqoVq167A3bmjap34J / bmoFqcj2dM3Pr9GK + b1p5bJXmXz9nEC + 3FiorYF4hcmXlo + gUrk + um / + e + QoVWfxxRJBQBAQBAQBQUAQqBwE8uzCwiMiaEqOWYR5jJ2 / 6Hl58nYHk0Pr1v1Ov62cTytXfE5r1yyyc6RgDhjI16 + 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
¿Alguien sabe cómo solucionar esto?
fuente
Respuestas:
prueba esto:
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'/>");
Esto muestra la imagen del lienzo en una página nueva, pero si tiene una
open popup in new tab
configuración, se muestraabout:blank
en la barra de direcciones.EDITAR: aunque
window.open("<img src='"+ c.toDataURL('image/png') +"'/>")
no funciona en FF o Chrome, lo siguiente funciona aunque la representación es algo diferente de lo que se muestra en el lienzo, creo que la transparencia es el problema:window.open(c.toDataURL('image/png'));
fuente
FileSaver.js debería poder ayudarlo aquí.
var canvas = document.getElementById("my-canvas"); // draw to canvas... canvas.toBlob(function(blob) { saveAs(blob, "pretty image.png"); });
fuente
Usé esta solución para establecer el nombre del archivo :
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'); }
fuente
Tuve este problema y esta es la mejor solución sin bibliotecas de script externas o adicionales: en etiquetas o archivos de Javascript, cree esta función: asumimos aquí que el lienzo es su lienzo:
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); }
En la parte del cuerpo de su HTML especifique el botón:
<a id="download" download="image.png"><button type="button" onClick="download()">Download</button></a>
Esto está funcionando y el enlace de descarga parece un botón. Probado en Firefox y Chrome.
fuente
Para acomodar los tres puntos:
El diálogo de archivo es una configuración en el navegador.
Para la parte de botón / guardar, asigne la siguiente función, resumida de otras respuestas, a sus botones al hacer clic:
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(); }
Ejemplo en Codepen
Otro enfoque, algo más limpio, es usar 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(); }); }
Ejemplo en Codepen
Ninguna solución es 100% compatible con varios navegadores, así que verifique el cliente
fuente
Quizás descubrí una mejor manera de no obligar al usuario a hacer clic derecho y "guardar imagen como". Dibuje en vivo el código base64 del lienzo en el
href
enlace y modifíquelo para que la descarga comience automáticamente. No sé si es universalmente compatible con el navegador, pero debería funcionar con el navegador principal / nuevo .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); });
Puedes envolver
<a>
todo lo que quieras.fuente
Prueba esto:
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; }
Puede simplemente poner este código en la consola en Firefox o Chrome y luego cambiar su ID de etiqueta de lienzo en este script anterior y ejecutar este script en la consola.
Después de ejecutar este código, verá el enlace como texto "haga clic aquí" en la parte inferior de la página html. haga clic en este enlace y abra el dibujo del lienzo como una imagen PNG en una nueva ventana, guarde la imagen.
fuente
Envíe un formulario que contenga una entrada con el valor de lienzo a DataURL ('imagen / png'), por ejemplo
// JAVASCRIPT
var canvas = document.getElementById("canvas"); var url = canvas.toDataUrl('image/png');
Inserte el valor de la URL en su entrada oculta en el elemento de formulario.
// 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);
fuente
canvas.toDataUrl(...)
debería serlocanvas.toDataURL(...)
.Código HTML de trabajo completo . Cortar + Pegar en un nuevo archivo .HTML:
Contiene dos ejemplos:
Probado en:
fuente
Realmente me gusta la respuesta de Tovask, pero no funciona debido a que la función tiene el nombre
download
( esta respuesta explica por qué). Tampoco veo el sentido de reemplazar "datos: imagen / ..." con "datos: aplicación / ...".El siguiente código ha sido probado en Chrome y Firefox y parece funcionar bien en ambos.
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>
fuente
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();
fuente