movimiento mano lineas fillrect examples ejemplos dibujar arc alzada javascript html5-canvas fileapi drawimage

javascript - mano - ¿Cómo puedo dibujar una imagen de la API de archivos HTML5 en Canvas?



fillrect canvas (3)

Me gustaría dibujar una imagen abierta con la API de archivos HTML5 en un lienzo.

En el handleFiles(e) , puedo acceder al archivo con e.target.files[0] pero no puedo dibujar esa imagen directamente usando drawImage . ¿Cómo dibujo una imagen de la API de archivos en el lienzo de HTML5?

Aquí está el código que he usado:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script> window.onload = function() { var input = document.getElementById(''input''); input.addEventListener(''change'', handleFiles); } function handleFiles(e) { var ctx = document.getElementById(''canvas'').getContext(''2d''); ctx.drawImage(e.target.files[0], 20,20); alert(''the image is drawn''); } </script> </head> <body> <h1>Test</h1> <input type="file" id="input"/> <canvas width="400" height="300" id="canvas"/> </body> </html>


Aquí hay un ejemplo completo (Fiddle) que utiliza FileReader (que tiene una mejor compatibilidad con el navegador como lo menciona Raynos). En este ejemplo, también escalo Canvas para que se ajuste a la imagen.

En el ejemplo de la vida real, puede escalar la imagen a un máximo para que su forma no explote ;-). Aquí hay un ejemplo con escalado (Fiddle) .


Usted tiene una instancia de File que no es una imagen.

Para obtener contenidos de un File , use un FileReader . A continuación, pase los contenidos a una instancia de Image , que se puede dibujar en un lienzo: http://jsfiddle.net/t7mv6/ .

Para obtener una imagen, use la new Image() . El src necesita ser una URL que haga referencia al File seleccionado. Puede usar URL.createObjectURL para obtener una URL que haga referencia a una Blob (un File también es una Blob ): http://jsfiddle.net/t7mv6/86/ .

var ctx = document.getElementById(''canvas'').getContext(''2d''); var img = new Image; img.onload = function() { ctx.drawImage(img, 20,20); alert(''the image is drawn''); } img.src = URL.createObjectURL(e.target.files[0]);

Nota: asegúrese de revocar la url del objeto cuando haya terminado, de lo contrario, perderá memoria. Si no está haciendo nada demasiado loco, puede pegar un URL.revokeObjectURL(img.src) en la función img.onload .

Referencias


Ejemplo en vivo

function handleFiles(e) { var ctx = document.getElementById(''canvas'').getContext(''2d''); var url = URL.createObjectURL(e.target.files[0]); var img = new Image(); img.onload = function() { ctx.drawImage(img, 20, 20); } img.src = url; }

window.URL.createObjectUrldocs

También podría usar FileReader para crear la URL del objeto.

El FileReader tiene un soporte de navegador ligeramente mejor.

El enfoque FileReader funciona en FF6 / Chrome. No estoy seguro de si la configuración de Img.src en una Blob es válida y cruzada de navegador.

Crear URLs de objetos es la forma correcta de hacerlo.

Editar:

Como se menciona en la ventana de window.URL soporte de window.URL mientras está desconectado no parece estar disponible en FF6 / Chrome.