Mi código funciona muy bien en mi localhost pero no funciona en el sitio.
Recibí este error de la consola, para esta línea .getImageData(x,y,1,1).data
:
Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
parte de mi código:
jQuery.Event.prototype.rgb=function(){
var x = this.offsetX || (this.pageX - $(this.target).offset().left),y = this.offsetY || (this.pageY - $(this.target).offset().top);
if (this.target.nodeName!=="CANVAS")return null;
return this.target.getContext('2d').getImageData(x,y,1,1).data;
}
Nota: mi url de imagen (src) es de una url de subdominio
javascript
html
html5-canvas
Erfan Safarpoor
fuente
fuente
Respuestas:
Como otros han dicho, está "contaminando" el lienzo al cargar desde un dominio de origen cruzado.
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
Sin embargo, puede evitar esto simplemente configurando:
Esto solo funciona si el servidor remoto establece el siguiente encabezado adecuadamente:
El selector de archivos de Dropbox cuando se usa la opción "enlace directo" es un gran ejemplo de esto. Lo uso en oddprints.com para pasar imágenes de la url de la imagen remota de Dropbox a mi lienzo y luego enviar los datos de la imagen a mi servidor. Todo en javascript
fuente
Descubrí que tenía que usar
.setAttribute('crossOrigin', '')
y tenía que agregar una marca de tiempo a la cadena de consulta de la URL para evitar que una respuesta 304 careciera delAccess-Control-Allow-Origin
encabezado.Esto me da
fuente
imgObj.setAttribute('crossOrigin', '')
resolvió para mí, ¡gracias!img.crossOrigin = "Anonymous"
funciona bien (como se menciona aquí ). Los navegadores @SanfordStaab tratan los archivos locales como si estuvieran en un dominio diferente; de lo contrario, los propietarios de sitios web podrían leer sus archivos locales. Debe solicitar imágenes del mismo dominio, o los encabezados en la respuesta a su solicitud deben decirle al navegador que está bien que el código de otros dominios lea ese archivo.No podrá dibujar imágenes directamente desde otro servidor en un lienzo y luego usarlas
getImageData
. Es un problema de seguridad y el lienzo se considerará "contaminado".¿Funcionaría para usted guardar una copia de la imagen en su servidor usando PHP y luego simplemente cargar la nueva imagen? Por ejemplo, podría enviar la URL al script PHP y guardarla en su servidor, luego devolver el nuevo nombre de archivo a su javascript de esta manera:
Usaría el script PHP con algunos javascript ajax como este:
Si lo usa
getImageData
en el lienzo después de eso, funcionará bien.Alternativamente, si no desea guardar la imagen completa, puede pasar las coordenadas x & y a su script PHP y calcular el valor rgba del píxel en ese lado. Creo que hay buenas bibliotecas para hacer ese tipo de procesamiento de imágenes en PHP.
Si desea utilizar este enfoque, avíseme si necesita ayuda para implementarlo.
edit-1: peeps señaló que el script php está expuesto y permite que internet lo use potencialmente de manera maliciosa. hay un millón de formas de manejar esto, una de las más simples es algún tipo de ofuscación de URL ... creo que las prácticas seguras de php merecen un google por separado; P
edit-2: por demanda popular, he agregado una verificación para asegurarme de que sea una imagen y no un script php (de: PHP verifica si el archivo es una imagen ).
fuente
Estaba viendo este error
Chrome
mientras estaba probando mi código localmente. Me cambiéFirefox
y ya no veo el error. Tal vez cambiar a otro navegador es una solución rápida.Si está utilizando la solución dada en la primera respuesta, asegúrese de agregarla
img.crossOrigin = "Anonymous";
justo después de declarar laimg
variable (por ejemplovar img = new Image();
).fuente
Su problema es que carga una imagen externa, es decir, desde otro dominio. Esto provoca un error de seguridad cuando intenta acceder a los datos de su contexto de lienzo.
fuente
Estás "contaminando" el lienzo al cargar desde un dominio de origen cruzado. Mira este artículo de MDN:
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
fuente
Cuando trabaje en local agregue un servidor
Tuve un problema similar cuando trabajaba en local. Su URL será la ruta al archivo local, por ejemplo, archivo: ///Users/PeterP/Desktop/folder/index.html.
Tenga en cuenta que estoy en un MAC.
Obtuve esto instalando un servidor http globalmente. https://www.npmjs.com/package/http-server
Pasos:
npm install http-server -g
http-server ~/Desktop/folder/
PD: Supongo que tienes un nodo instalado, de lo contrario no llegarás muy lejos ejecutando comandos npm.
fuente
Como dice Matt Burns en su respuesta , es posible que deba habilitar CORS en el servidor donde se alojan las imágenes problemáticas.
Si el servidor es Apache, esto se puede hacer agregando el siguiente fragmento (desde aquí ) a su configuración de VirtualHost o a un
.htaccess
archivo:... si lo agrega a un VirtualHost, probablemente también necesite volver a cargar la configuración de Apache (por ejemplo,
sudo service apache2 reload
si Apache se está ejecutando en un servidor Linux)fuente
Mi problema estaba tan desordenado que solo codifiqué la imagen en base64 para asegurarme de que no hubiera problemas CORS
fuente
Me encuentro con el mismo problema hoy, y lo resuelvo por el siguiente código.
código HTML:
código js:
código como el anterior, y no hay ningún problema de dominio cruzado.
fuente
Estaba teniendo el mismo problema, y para mí funcionó simplemente concatenando
https:${image.getAttribute('src')}
fuente