TL; DR;
¿Hay alguna forma de comprimir una imagen (principalmente jpeg, png y gif) directamente en el navegador antes de cargarla? Estoy bastante seguro de que JavaScript puede hacer esto, pero no puedo encontrar la manera de lograrlo.
Aquí está el escenario completo que me gustaría implementar:
- el usuario va a mi sitio web y elige una imagen a través de un
input type="file"
elemento, - esta imagen se recupera a través de JavaScript, realizamos algunas verificaciones, como el formato de archivo correcto, el tamaño máximo de archivo, etc.
- si todo está bien, se muestra una vista previa de la imagen en la página,
- el usuario puede realizar algunas operaciones básicas como rotar la imagen 90 ° / -90 °, recortarla siguiendo una proporción predefinida, etc., o el usuario puede cargar otra imagen y volver al paso 1,
- cuando el usuario está satisfecho, la imagen editada se comprime y "guarda" localmente (no se guarda en un archivo, sino en la memoria / página del navegador), -
- el usuario llena un formulario con datos como nombre, edad, etc.
- el usuario hace clic en el botón "Finalizar", luego el formulario que contiene los datos + imagen comprimida se envía al servidor (sin AJAX),
El proceso completo hasta el último paso debe realizarse del lado del cliente y debe ser compatible con los últimos Chrome y Firefox, Safari 5+ e IE 8+ . Si es posible, solo debe usarse JavaScript (pero estoy bastante seguro de que esto no es posible).
No he codificado nada en este momento, pero ya lo he pensado. La lectura de archivos localmente es posible a través de la API de archivos , la vista previa y la edición de imágenes se pueden realizar utilizando el elemento Canvas , pero no puedo encontrar una manera de hacer la parte de compresión de imágenes .
Según html5please.com y caniuse.com , admitir esos navegadores es bastante difícil (gracias a IE), pero se podría hacer usando polyfill como FlashCanvas y FileReader .
En realidad, el objetivo es reducir el tamaño del archivo, por lo que veo la compresión de imágenes como una solución. Pero sé que las imágenes cargadas se mostrarán en mi sitio web, siempre en el mismo lugar, y conozco la dimensión de esta área de visualización (por ejemplo, 200x400). Entonces, podría cambiar el tamaño de la imagen para que se ajuste a esas dimensiones, reduciendo así el tamaño del archivo. No tengo idea de cuál sería la relación de compresión para esta técnica.
Qué piensas ? ¿Tienes algún consejo que darme? ¿Conoce alguna forma de comprimir una imagen del lado del navegador en JavaScript? Gracias por tus respuestas.