2013-04-23 9 views
14

voglio comprimere l'immagine ripresa da una telecamera a formato png per renderli più piccoli di dimensioni, quindi sto usando questo codice:bitmap.compress (Bitmap.CompressFormat.PNG, 0, fOut) rendendo l'immagine più grande dimensione dell'originale

compressedPictureFile = new File(imagePath); 
Bitmap bitmap = BitmapFactory.decodeFile(imagePath); 
FileOutputStream fOut = new FileOutputStream(compressedPictureFile); 
boolean compressed = bitmap.compress(Bitmap.CompressFormat.PNG, 0, fOut); 
fOut.flush(); 
fOut.close(); 

il problema è che compressedPictureFile è in realtà più grande che l'immagine originale (da 1 Mb a 6Mb)

che cosa mi manca? E questo è il modo migliore per ridurre le dimensioni di un'immagine?

Grazie

risposta

21

Le immagini scattate con la fotocamera sono molto probabilmente memorizzati nella jpg -format, che è perdita di dati, ma è relativamente buono per le immagini con un sacco di colori (come le fotografie).

Quando si comprime la bitmap utilizzando il metodo, lo si salva come png. La compressione png è senza perdita di dati, ma può raggiungere file con dimensioni ridotte quando ci sono pochi colori (come in alcuni logotipi o altri elementi grafici). Quando aumenta la quantità di colori e complessità in un file PNG, anche le dimensioni del file (ecco perché la fotocamera salva un jpg - il rapporto qualità/dimensione file è molto meglio del png per la maggior parte delle fotografie).

Quindi, se si desidera ridurre la dimensione delle immagini, utilizzare la compressione jpg e sperimentare con il parametro di qualità. Si potrebbe anche voler diminuire la risoluzione delle immagini, poiché ciò farà risparmiare molto spazio (un file con una risoluzione del 50% sarà circa il 25% in dimensioni di dati).

+0

è il parametro di qualità la stessa risoluzione? come posso ridurre la risoluzione? –

+1

Il parametro 'quality' influisce sulla buona conservazione dei colori quando si utilizza la compressione jpg. Non ha alcun effetto quando si stampa un png. Puoi leggere un po 'il metodo 'compress' qui: http://developer.android.com/reference/android/graphics/Bitmap.html#compress%28android.graphics.Bitmap.CompressFormat,%20int,%20java .io.OutputStream% 29 – Jave

+1

Esistono più esercitazioni per ridurre le dimensioni dell'immagine, ma il modo più semplice è semplicemente creare una nuova bitmap più piccola tramite 'Bitmap.createScaledBitmap': http://developer.android.com/reference/ android/graphics/Bitmap.html # createScaledBitmap% 28android.graphics.Bitmap,% 20int,% 20int,% 20boolean% 29 – Jave

0

funziona bene sul mio app

public static String makeScreen(View view) throws Exception { 
    String filename = "file.png"; 
    view.setDrawingCacheEnabled(true); 
    view.buildDrawingCache(); 
    Bitmap b = view.getDrawingCache(); 
    FileOutputStream file = null; 

    try { 
     file = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "folder/" + filename); 
     if (file != null) { 
      b.compress(Bitmap.CompressFormat.PNG, 98, file); 
      file.close(); 
     } 
     view.destroyDrawingCache(); 
    } catch (Exception e) { view.destroyDrawingCache(); } 
} 
Problemi correlati