2014-09-25 14 views
5

È necessario generare immagini .png di dimensioni pari a ~ 20k utilizzando la tela HTML5. Sfortunatamente, quando crei .pngs usando il metodo toDataURL(), non puoi specificare la qualità che puoi con jpegs.Come comprimere le immagini .png durante l'esportazione da Canvas usando toDataURL()?

Qualche idea per una soluzione alternativa? toDataURL sembra essere l'unico modo per generare immagini da Canvas e canvas sembra essere lo strumento migliore per l'elaborazione delle immagini senza interazione con il server. Apprezzo qualsiasi suggerimento.

+0

Io non credo che ci sia alcuna soluzione diversa da inviarlo al server, ma [un articolo] (http://blog.import.io/tech-blog/html5-canvas-todataurl- webm-vs-png-vs-jpeg) afferma che il parametro di qualità funziona effettivamente per PNG. –

+0

Grazie a Derek, anche se non ho avuto fortuna a fornire PNG con un parametro di qualità. Questo articolo fornisce un modo interessante per "ridimensionare" le immagini: http://stackoverflow.com/questions/18761404/how-to-scale-images-on-a-html5-canvas-with-better-interpolation – user2348399

+0

PNG è un formato di compressione senza perdita di dati. Puoi usare la compressione con jpg o webp ma non con pngs. https://developer.mozilla.org/en/docs/Web/API/HTMLCanvasElement/toDataURL – ElChiniNet

risposta

2

C'è un modo per avere compressione per immagini PNG utilizzando il processo di perdita dello zlib senza perdita http://www.w3.org/TR/PNG-Compression.html. Esiste una libreria (https://github.com/ShyykoSerhiy/canvas-png-compression) che fornisce uno shim per HTMLCanvasElement.toDataURL() quando il tipo di immagine è 'image/png' e consente di fornire 'quality' come secondo parametro a HTMLCanvasElement.toDataURL() per png.

NOTA che fornisce risultati migliori (dimensioni ridotte) solo in Chrome. Firefox a volte ha una compressione migliore di canvas-png-compression (come per la versione 0.0.3).

1

Si può fare qualcosa ridimensionandolo e ridimensionandolo nuovamente.

  • Ridimensionare disegnando su una tela più piccola, quindi ottenere l'URL dei dati.

  • Creare un oggetto immagine impostare l'origine dati come origine.

  • Draw sulla tela originale con questo oggetto img (ovviamente all'interno del callback evento onload)

  • Trovare il rapporto tra dimensioni delle tele per darvi un risultato ottimale sperimentando un po '.

+0

anche questo [collegamento] (http://stackoverflow.com/questions/18761404/how-to-scale-images- on-a-html5-canvas-with-better-interpolation? lq = 1) per una migliore scalabilità – ArJ

Problemi correlati