Quiero guardar mi lienzo en un img. Tengo esta función:
function save() {
document.getElementById("canvasimg").style.border = "2px solid";
var dataURL = canvas.toDataURL();
document.getElementById("canvasimg").src = dataURL;
document.getElementById("canvasimg").style.display = "inline";
}
Me da error:
SecurityError no capturado: no se pudo ejecutar 'toDataURL' en 'HTMLCanvasElement': los lienzos contaminados no se pueden exportar.
¿Qué tengo que hacer?
javascript
html5-canvas
usuario3465096
fuente
fuente
Respuestas:
Por razones de seguridad, su unidad local se declara como "otro dominio" y manchará el lienzo.
(¡Esto se debe a que su información más confidencial probablemente esté en su disco local!).
Durante las pruebas, pruebe estas soluciones alternativas:
Coloque todos los archivos relacionados con la página (.html, .jpg, .js, .css, etc.) en su escritorio (no en subcarpetas).
Publique sus imágenes en un sitio que admita el intercambio entre dominios (como dropbox.com). Asegúrese de poner sus imágenes en la carpeta pública de Dropbox y también establecer el indicador de origen cruzado al descargar la imagen (var img = new Image (); img.crossOrigin = "anónimo" ...)
Instale un servidor web en su computadora de desarrollo (los servidores web IIS y PHP tienen ediciones gratuitas que funcionan bien en una computadora local).
fuente
En la etiqueta img establezca crossorigin en Anónimo.
fuente
Si alguien ve mi respuesta, tal vez en esta condición:
1. Intentando obtener una captura de pantalla de mapa en lienzo usando capas abiertas (versión> = 3)
2. Y vimos el ejemplo de exportación de mapa
3. Usando ol.source.XYZ para representar la capa del mapa
¡Bingo!
Usando ol.source.XYZ.crossOrigin = 'Anónimo' para resolver su confusión. O como el siguiente código:
fuente
Si está utilizando la
ctx.drawImage()
función, puede hacer lo siguiente:Y en su devolución de llamada ahora puede usarlo
ctx.drawImage
y exportarlo usandotoDataURL
fuente
Tainted canvases may not be exported.
mensaje de error.En mi caso, estaba dibujando en una etiqueta de lienzo de un video. Para abordar el error del lienzo contaminado, tuve que hacer dos cosas:
fuente
Parece que está utilizando una imagen de una URL que no ha configurado el encabezado correcto de Access-Control-Allow-Origin y, por lo tanto, el problema. Puede obtener esa imagen de su servidor y obtenerla de su servidor para evitar problemas de CORS.
fuente
Resolví el problema usando la
useCORS: true
opciónfuente
Echa un vistazo a [imagen habilitada CORS] [1] de MDN. Básicamente, debe tener un servidor que aloje imágenes con el encabezado apropiado Access-Control-Allow-Origin.
Podrá guardar esas imágenes en el almacenamiento DOM como si se hubieran servido desde su dominio; de lo contrario, se encontrará con un problema de seguridad.
fuente
Solo como una compilación de la respuesta de @ markE, si desea crear un servidor local. No tendrá este error en un servidor local.
Si tienes PHP instalado en tu computadora:
php -S localhost:3000
← Observe la 'S' mayúsculao
Si tiene Node.js instalado en su computadora:
npm init -y
npm install live-server -g
osudo npm install live-server -g
en una Maclive-server
y debería abrir automáticamente una nueva pestaña en el navegador con su sitio web abierto.Nota: recuerde tener un archivo index.html en la raíz de su carpeta o de lo contrario podría tener algunos problemas.
fuente
También resolví este error agregando
useCORS : true,
mi código como -fuente