Aquí hay un rascador de fideos.
Teniendo en cuenta que tenemos almacenamiento local HTML5 y xhr v2 y otras cosas. Me preguntaba si alguien podría encontrar un ejemplo de trabajo o simplemente darme un sí o un no para esta pregunta:
¿Es posible cambiar el tamaño de una imagen usando el nuevo almacenamiento local (o lo que sea), de modo que un usuario que no tenga idea de cómo cambiar el tamaño de una imagen pueda arrastrar su imagen de 10 mb a mi sitio web, cambiar su tamaño usando el nuevo almacenamiento local y LUEGO cárguelo en el tamaño más pequeño.
Sé muy bien que puedes hacerlo con Flash, applets de Java, X activo ... La pregunta es si puedes hacerlo con Javascript + Html5.
Esperamos la respuesta en este caso.
Ta por ahora.
fuente
onload
en la imagen (adjunte el controlador antes de la configuraciónsrc
), ya que el navegador puede decodificar de forma asincrónica y es posible que los píxeles no estén disponibles antesdrawImage
.ctx.drawImage()
acerque al final.Abordé este problema hace unos años y subí mi solución a github como https://github.com/rossturner/HTML5-ImageUploader
La respuesta de robertc utiliza la solución propuesta en la publicación del blog de Mozilla Hacks , sin embargo, descubrí que esto proporcionaba una calidad de imagen realmente pobre al cambiar el tamaño a una escala que no era 2: 1 (o un múltiplo de la misma). Comencé a experimentar con diferentes algoritmos de cambio de tamaño de imagen, aunque la mayoría terminó siendo bastante lenta o de lo contrario tampoco fue de gran calidad.
Finalmente, encontré una solución que creo que se ejecuta rápidamente y que también tiene un rendimiento bastante bueno, ya que la solución de Mozilla de copiar de 1 lienzo a otro funciona rápidamente y sin pérdida de calidad de imagen en una proporción de 2: 1, dado un objetivo de x píxeles de ancho y píxeles de alto, uso este método de cambio de tamaño del lienzo hasta que la imagen esté entre x y 2 x , y y y 2 y . En este punto, paso a cambiar el tamaño de la imagen algorítmica para el "paso" final de cambiar el tamaño al tamaño deseado. Después de probar varios algoritmos diferentes, me decidí por la interpolación bilineal tomada de un blog que ya no está en línea pero que es accesible a través de Internet Archive, que da buenos resultados, aquí está el código aplicable:
Esto reduce la imagen a un ancho de
config.maxWidth
, manteniendo la relación de aspecto original. En el momento del desarrollo, esto funcionaba en iPad / iPhone Safari, además de los principales navegadores de escritorio (IE9 +, Firefox, Chrome), por lo que espero que aún sea compatible dada la mayor aceptación de HTML5 en la actualidad. Tenga en cuenta que la llamada canvas.toDataURL () toma un tipo mime y una calidad de imagen que le permitirá controlar la calidad y el formato del archivo de salida (potencialmente diferente de la entrada si lo desea).El único punto que esto no cubre es mantener la información de orientación, sin el conocimiento de estos metadatos, la imagen se redimensiona y se guarda tal cual, perdiendo cualquier metadato dentro de la imagen para orientación, lo que significa que las imágenes tomadas en un dispositivo de tableta "al revés" fueron renderizado como tal, aunque se habrían volteado en el visor de la cámara del dispositivo. Si esto es una preocupación, esta publicación de blog tiene una buena guía y ejemplos de código sobre cómo lograr esto, que estoy seguro podría integrarse en el código anterior.
fuente
Corrección a lo anterior:
fuente
dataurl
no está allí.img.width
eimg.height
inicialmente lo están0
. Deberías poner el resto de la función adentroimg.addEventListener('load', function () { // now the image has loaded, continue... });
Modificación de la respuesta de Justin que funciona para mí:
fuente
Si no desea reinventar la rueda, puede probar plupload.com
fuente
Mecanografiado
fuente
Esto no funcionará. En el lado de PHP no puede guardar el archivo con esto.
Use este código en su lugar:
fuente
Cambiar el tamaño de las imágenes en un elemento de lienzo generalmente es una mala idea, ya que utiliza la interpolación de cajas más barata. La imagen resultante notable se degrada en calidad. Recomiendo usar http://nodeca.github.io/pica/demo/ que puede realizar la transformación de Lanczos en su lugar. La página de demostración anterior muestra la diferencia entre el lienzo y los enfoques de Lanczos.
También utiliza trabajadores web para cambiar el tamaño de las imágenes en paralelo. También hay implementación de WEBGL.
Hay algunos redimensionadores de imágenes en línea que usan pica para hacer el trabajo, como https://myimageresizer.com
fuente
La respuesta aceptada funciona muy bien, pero la lógica de cambio de tamaño ignora el caso en que la imagen es más grande que el máximo en solo uno de los ejes (por ejemplo, altura> maxHeight pero ancho <= maxWidth).
Creo que el siguiente código se ocupa de todos los casos de una manera más directa y funcional (ignore las anotaciones de tipo mecanografiado si usa JavaScript simple):
fuente
Puede usar dropzone.js si desea usar un administrador de carga simple y fácil con el cambio de tamaño antes de las funciones de carga.
Tiene funciones de cambio de tamaño incorporadas, pero puede proporcionar las suyas si lo desea.
fuente