TL; DR;
Existe uma maneira de compactar uma imagem (principalmente jpeg, png e gif) diretamente do lado do navegador, antes de enviá-la? Tenho certeza de que o JavaScript pode fazer isso, mas não consigo encontrar uma maneira de fazer isso.
Aqui está o cenário completo que eu gostaria de implementar:
- o usuário vai ao meu site e escolhe uma imagem por meio de um
input type="file"
elemento, - esta imagem é recuperada via JavaScript, fazemos algumas verificações, como formato de arquivo correto, tamanho máximo do arquivo, etc.
- se tudo estiver OK, uma prévia da imagem é exibida na página,
- o usuário pode fazer algumas operações básicas, como girar a imagem em 90 ° / -90 °, recortá-la seguindo uma proporção pré-definida, etc, ou o usuário pode carregar outra imagem e retornar à etapa 1,
- quando o usuário está satisfeito, a imagem editada é então compactada e "salva" localmente (não salva em um arquivo, mas na memória / página do navegador), -
- o usuário preenche um formulário com dados como nome, idade etc,
- o usuário clica no botão "Terminar", então o formulário contendo dados + imagem compactada é enviado para o servidor (sem AJAX),
O processo completo até a última etapa deve ser feito do lado do cliente e deve ser compatível com o Chrome e Firefox mais recentes, Safari 5+ e IE 8+ . Se possível, apenas JavaScript deve ser usado (mas tenho certeza de que isso não é possível).
Não codifiquei nada agora, mas já pensei sobre isso. A leitura de arquivos localmente é possível através da API File , a visualização e edição da imagem podem ser feitas usando o elemento Canvas , mas não consigo encontrar uma maneira de fazer a parte de compressão da imagem .
De acordo com html5please.com e caniuse.com , suportar esses navegadores é bastante difícil (graças ao IE), mas pode ser feito usando polyfill como FlashCanvas e FileReader .
Na verdade, o objetivo é reduzir o tamanho do arquivo, então vejo a compactação de imagens como uma solução. Mas, eu sei que as imagens carregadas serão exibidas no meu site, sempre no mesmo lugar, e eu sei a dimensão dessa área de exibição (por exemplo, 200x400). Então, eu poderia redimensionar a imagem para caber nessas dimensões, reduzindo assim o tamanho do arquivo. Não tenho ideia de qual seria a taxa de compressão para essa técnica.
O que você acha ? Você tem algum conselho para me dizer? Você conhece alguma maneira de compactar uma imagem do lado do navegador em JavaScript? Obrigado por suas respostas.