2013-04-23 9 views
14

Chcę skompresować obraz z aparatu do formatu PNG, aby zmniejszyć rozmiar, , więc używam tego Kod:bitmap.compress (Bitmap.CompressFormat.PNG, 0, fOut) zwiększanie rozmiaru obrazu w stosunku do oryginału

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(); 

problemem jest to, że compressedPictureFile jest rzeczywiście większa, że ​​obraz (od 1 MB do 6Mb) oryginał

Czego mi brakuje? A czy to najlepszy sposób na zmniejszenie rozmiaru obrazu?

Dzięki

Odpowiedz

21

zdjęć zrobionych za pomocą aparatu są najczęściej przechowywane w jpg -format, który jest stratny, ale jest stosunkowo dobre dla obrazów z dużą ilością kolorów (takich jak fotografie).

Podczas kompresji bitmapy za pomocą metody zapisujesz ją jako png. Kompresja png jest bezstratna, ale może osiągnąć całkiem małe rozmiary, gdy istnieje kilka kolorów (na przykład w niektórych logotypach lub innych grafikach). Kiedy wzrasta ilość kolorów i złożoności pliku png, wzrasta rozmiar pliku (dlatego aparat zapisuje plik jpg - stosunek jakości do rozmiaru jest znacznie lepszy niż png dla większości zdjęć).

Tak więc, jeśli chcesz zmniejszyć rozmiar zdjęć, użyj kompresji jpg i poeksperymentuj z parametrem jakości. Można również zmniejszyć rozdzielczość obrazów, ponieważ pozwoli to zaoszczędzić dużo miejsca (plik o rozdzielczości 50% będzie miał wielkość około 25% w rozmiarze danych).

+0

jest parametrem jakość taka sama jak rozdzielczość? jak mogę zmniejszyć rozdzielczość? –

+1

Parametr 'quality' wpływa na to, jak dobrze zachowane będą kolory przy korzystaniu z kompresji jpg. Nie ma żadnego efektu przy wyprowadzaniu png. Możesz przeczytać trochę o metodzie 'compress' tutaj: http://developer.android.com/reference/android/graphics/Bitmap.html#compress%28android.graphics.Bitmap.CompressFormat,%20int,%20java .io.OutputStream% 29 – Jave

+1

Istnieje wiele samouczków dotyczących zmniejszania rozmiaru obrazu, ale najprościej jest po prostu utworzyć nową, mniejszą bitmapę za pomocą 'Bitmap.createScaledBitmap': http://developer.android.com/reference/ android/graphics/Bitmap.html # createScaledBitmap% 28android.graphics.Bitmap,% 20int,% 20int,% 20boolean% 29 – Jave

0

działać dobrze na moim 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(); } 
} 
Powiązane problemy