Aqui está um arranhão de macarrão.
Tendo em mente, temos armazenamento local HTML5 e xhr v2 e o que não. Eu queria saber se alguém poderia encontrar um exemplo de trabalho ou mesmo apenas me dar um sim ou não para esta pergunta:
É possível pré-dimensionar uma imagem usando o novo armazenamento local (ou o que for), para que um usuário que não tenha idéia de redimensionar uma imagem possa arrastar sua imagem de 10 MB para o meu site, redimensione-a usando o novo armazenamento local e ENTÃO carregue-o no tamanho menor.
Eu sei muito bem que você pode fazê-lo com Flash, applets Java, X ativo ... A questão é se você pode fazer com Javascript + Html5.
Ansioso para a resposta sobre este.
Ta por enquanto.
fonte
onload
a imagem (anexar manipulador antes de definirsrc
), porque o navegador pode decodificar de forma assíncrona e os pixels podem não estar disponíveis antesdrawImage
.ctx.drawImage()
perto do final.Resolvi esse problema há alguns anos e carreguei minha solução no github como https://github.com/rossturner/HTML5-ImageUploader
A resposta de robertc usa a solução proposta na postagem do blog Mozilla Hacks , no entanto, eu achei que essa qualidade de imagem era realmente ruim ao redimensionar para uma escala que não era 2: 1 (ou um múltiplo dela). Comecei a experimentar diferentes algoritmos de redimensionamento de imagem, embora a maioria acabasse sendo muito lenta ou também não era boa em qualidade.
Finalmente, eu vim com uma solução que, acredito, é executada rapidamente e tem um desempenho muito bom também - já que a solução Mozilla de copiar de uma tela para outra funciona rapidamente e sem perda da qualidade da imagem na proporção 2: 1, dado o objetivo de x pixels de largura e y pixels de altura, que usam este método de redimensionamento de lona até que a imagem está entre x e 2 x , e Y e 2 y . Nesse ponto, volto para o redimensionamento algorítmico da imagem para a "etapa" final de redimensionar para o tamanho alvo. Depois de tentar vários algoritmos diferentes, decidi pela interpolação bilinear retirada de um blog que não está mais online, mas acessível através do Internet Archive, que fornece bons resultados, eis o código aplicável:
Isso reduz a imagem a uma largura de
config.maxWidth
, mantendo a proporção original. No momento do desenvolvimento, isso funcionou no iPad / iPhone Safari, além dos principais navegadores de desktop (IE9 +, Firefox, Chrome), então espero que ainda seja compatível, dada a adoção mais ampla do HTML5 atualmente. Observe que a chamada canvas.toDataURL () usa um tipo MIME e qualidade de imagem que permite controlar a qualidade e o formato do arquivo de saída (potencialmente diferente da entrada, se desejar).O único ponto que isso não cobre é a manutenção das informações de orientação, sem o conhecimento desses metadados, a imagem é redimensionada e salva como está, perdendo quaisquer metadados na imagem para orientação, o que significa que as imagens tiradas em um tablet "de cabeça para baixo" foram renderizados como tal, apesar de terem sido invertidos no visor da câmera do dispositivo. Se isso for uma preocupação, esta postagem no blog tem um bom guia e exemplos de código sobre como fazer isso, que eu tenho certeza que poderia ser integrado ao código acima.
fonte
Correção acima:
fonte
dataurl
não existe.img.width
e,img.height
inicialmente, eles são0
. Você deve colocar o resto da função dentroimg.addEventListener('load', function () { // now the image has loaded, continue... });
Modificação na resposta de Justin que funciona para mim:
fonte
Se você não quiser reinventar a roda, tente plupload.com
fonte
Texto datilografado
fonte
Isso não vai funcionar. No lado do PHP, você não pode salvar arquivos com isso.
Use este código:
fonte
O redimensionamento de imagens em um elemento de tela geralmente é uma má ideia, pois usa a interpolação de caixa mais barata. A imagem resultante visível diminui a qualidade. Eu recomendo usar http://nodeca.github.io/pica/demo/ que pode executar a transformação de Lanczos. A página de demonstração acima mostra a diferença entre as abordagens canvas e Lanczos.
Ele também usa trabalhadores da Web para redimensionar imagens em paralelo. Há também implementação WEBGL.
Existem alguns redimensionadores de imagens on-line que usam o pica para fazer o trabalho, como https://myimageresizer.com
fonte
A resposta aceita funciona muito bem, mas a lógica de redimensionamento ignora o caso em que a imagem é maior que o máximo em apenas um dos eixos (por exemplo, altura> maxHeight, mas largura <= maxWidth).
Acho que o código a seguir cuida de todos os casos de maneira mais direta e funcional (ignore as anotações do tipo datilografado se estiver usando javascript simples):
fonte
Você pode usar o dropzone.js se desejar usar o gerenciador de upload simples e fácil com o redimensionamento antes das funções de upload.
Ele possui funções de redimensionamento integradas, mas você pode fornecer suas próprias, se desejar.
fonte