Me gustaría saber si hay una forma de modificar/acceder dinámicamente a los datos contenidos en las imágenes html como si fueran un elemento de lienzo html5. Con canvas, puede acceder en javascript a los datos de píxel sin procesar con getImageData() y putImageData(), pero hasta ahora no he podido averiguar cómo hacerlo con las imágenes.posible utilizar imágenes html como canvas con getImageData/putImageData?
Respuesta
// 1) Create a canvas, either on the page or simply in code
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// 2) Copy your image data into the canvas
var myImgElement = document.getElementById('foo');
ctx.drawImage(myImgElement, 0, 0);
// 3) Read your image data
var w = myImgElement.width, h=myImgElement.height;
var imgdata = ctx.getImageData(0,0,w,h);
var rgba = imgdata.data;
// 4) Read or manipulate the rgba as you wish
for (var px=0,ct=w*h*4;px<ct;px+=4){
var r = rgba[px ];
var g = rgba[px+1];
var b = rgba[px+2];
var a = rgba[px+3];
}
// 5) Update the context with newly-modified data
ctx.putImageData(imgdata,0,0);
// 6) Draw the image data elsewhere, if you wish
someOtherContext.drawImage(ctx.canvas, 0, 0);
Tenga en cuenta que el paso 2 también puede ser llevado desde una imagen cargada directamente en la escritura, no en la página:
// 2b) Load an image from which to get data
var img = new Image;
img.onload = function(){
ctx.drawImage(img, 0, 0);
// ...and then steps 3 and on
};
img.src = "/images/foo.png"; // set this *after* onload
No estoy seguro de si es posible, pero puede intentar solicitar información de píxeles desde PHP, si la biblioteca GD será una tarea fácil, pero seguramente será más lenta. Como no especificó la aplicación, le sugiero que compruebe SVG para esta tarea si pueden ser imágenes vectoriales, de lo que podrá consultar o modificar la imagen.
que quería hacer esto en su totalidad en el navegador, no utilizar cualquier script del lado del servidor en absoluto. –
Puede dar algunos detalles, es bastante imposible hacerlo, pero podría haber soluciones alternativas. –
si tuviera que implementar esto en algún software, probablemente actualizaría el nodo DOM de la imagen. Sin embargo, mi pregunta fue dirigida más al nivel de "¿esto es posible?" para aprender más acerca de html en sí mismo. –
Puede dibujar la imagen en un elemento canvas con drawImage(), y luego obtener los datos de píxeles del lienzo.
Esto no me permite manipular los datos de la imagen en sí, que es lo que quiero hacer. –
Una vez que la imagen ha sido copiada al elemento 'canvas', puede manipularla de cualquier forma que normalmente manipularía los datos de píxel' canvas'. –
primero desea dibujar una imagen en el lienzo y luego obtener el imageData del lienzo, es una forma incorrecta, porque el js piensa que es un "acceso entre dominios", pero el método getIamgeData no permite el "acceso entre dominios" a una imagen. Puede intentarlo ponga el en el lugar de la raíz y acceda a él por "localhost".
Después de tener algunos problemas con este código, quiero añadir una o dos cosas a la respuesta de Phrogz:
// 1) Create a canvas, either on the page or simply in code
var w = myImgElement.width, h=myImgElement.height; // NEw : you need to set the canvas size if you don't want bug with images that makes more than 300*150
var canvas = document.createElement('canvas');
canvas.height = h;
canvas.width = w;
var ctx = canvas.getContext('2d');
// 2) Copy your image data into the canvas
var myImgElement = document.getElementById('foo');
ctx.drawImage(myImgElement, 0, 0, w, h); // Just in case...
// 3) Read your image data
var imgdata = ctx.getImageData(0,0,w,h);
var rgba = imgdata.data;
// And then continue as in the other code !
que trabajó para mí (IE10x64, Chromex64 en Win7, linux brazo cromo, parece ... a error con Firefox 20 Linux brazo, pero no estoy seguro ... para volver a probar)
--html--
<canvas id="myCanvas" width="600" height="300"></canvas>
<canvas id="myCanvasOffscreen" width="1" height="1"></canvas>
- JS -
// width & height can be used to scale image !!!
function getImageAsImageData(url, width, height, callack) {
var canvas = document.getElementById('myCanvasOffscreen');
canvas.width = width;
canvas.height = height;
var context = canvas.getContext('2d');
var imageObj = new Image();
imageObj.onload = function() {
context.drawImage(imageObj, 0, 0, width, height);
imgData = context.getImageData(0,0,width, height);
canvas.width = 1;
canvas.height = 1;
callack(imgData);
};
imageObj.src = url;
}
- entonces -
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var imgData;
getImageAsImageData('central_closed.png', IMG_WIDTH, IMG_HEIGHT,
function(imgData) {
// do what you want with imgData.data (rgba array)
// ex. colorize(imgData, 25, 70, 0);
ctx.putImageData(imgData,0,0);
}
);
trabajar directamente en elemento IMG es también válida:
var image = document.createElement('img'),w,h ;
image.src = "img/test.jpg" ;
$(image).one('load',function(){
w = image.naturalWidth ;
h = image.naturalHeight ;
var cnv = document.createElement('canvas') ;
$(cnv).attr("width",w) ;
$(cnv).attr("height",h) ;
var ctx = cnv.getContext('2d') ;
ctx.drawImage(image,0,0) ;
var imgdata = ctx.getImageData(0,0,w,h) ;
var rgba = imgdata.data ;
for (var px=0,ct=w*h*4;px<ct;px+=4){
var r = rgba[px+0] ;
var g = rgba[px+1] ;
var b = rgba[px+2] ;
var a = rgba[px+3] ;
// Do something
rgba[px+0] = r ;
rgba[px+1] = g ;
rgba[px+2] = b ;
rgba[px+3] = a ;
}
ctx.putImageData(imgdata,0,0) ;
$("body").append(cnv) ;
}) ;
- 1. HTML canvas drawImage con un ángulo
- 2. HTML Canvas Tracing
- 3. getPixel from HTML Canvas?
- 4. HTML Canvas Unit testing
- 5. Problemas de rendimiento con HTML to canvas, ¿dónde comenzar?
- 6. ¿Es posible utilizar imágenes de fondo repetitivas en sprites?
- 7. ¿Debo utilizar imágenes espaciadoras al codificar correos electrónicos HTML?
- 8. HTML Canvas Interval vs RequestAnimationFrame
- 9. Cómo utilizar HTML5 <canvas> clip()
- 10. ¿Es posible utilizar Python con php
- 11. cómo utilizar tinymce con imágenes en mi sitio web como stackoverflow hace
- 12. Use <canvas> como fondo CSS
- 13. Firefox lanzando una excepción con HTML Canvas putImageData
- 14. ¿Cómo puedo realizar el relleno de inundación con HTML Canvas?
- 15. ¿Es posible visualizar imágenes con el método loadDataWithBaseURL() en android?
- 16. Agregar imágenes al html con javascript
- 17. Guardar una animación creada con HTML5 Canvas
- 18. PHP y HTML: ¿cómo recorrer un directorio con imágenes?
- 19. ¿Cómo usar Canvas para fusionar dos imágenes en Android?
- 20. Generar correo electrónico HTML con imágenes incrustadas en Delphi
- 21. Manipulación de imágenes y mapeo de texturas utilizando HTML5 Canvas?
- 22. Caché HTML5 de imágenes en canvas/preguntas de putImageData
- 23. Cómo convertir imágenes a html?
- 24. animación en espera con canvas de HTML5
- 25. ¿Cuál es la diferencia de velocidad entre dibujar con html5 canvas y html y javascript?
- 26. Android: ¿Cómo recibir un html completo, con imágenes y archivos css como cadena?
- 27. HTML5 Canvas como fondo de la imagen CSS?
- 28. ¿Es posible utilizar la autenticación implícita con una solicitud XMLHTTP?
- 29. ¿Existe un buen método para dibujar nubes dinámicamente con HTML5 canvas y javascript sin usar imágenes?
- 30. ¿Es posible utilizar vagabundeo con EmacsW32 y cygwin?
su código no funciona, someOtherContext.drawImage (ctx, 0,0); sigue arrojando "Tipo de error" porque el primer atributo debe ser imagen, no contexto (chrome 7, firefox 3.6) –
Si se desea iterar sobre todos los píxeles en la imagen, el paso 4 debe ser ... ct = w * h * 4. .. ya que hay cuatro valores por píxel. – pettys
@dvh Creo que fue pensado para ser "lienzo" en lugar de ctx. drawImage puede tomar una imagen o un lienzo. – pettys