Android - Zmniejsz rozmiar pliku obrazu
Mam plik obrazu URI i chcę zmniejszyć jego rozmiar, aby go przesłać. Początkowy rozmiar pliku obrazu zależy od urządzenia mobilnego do mobilnego (może wynosić 2 MB, podobnie jak 500 KB), ale chcę, aby ostateczny rozmiar wynosił około 200 KB, więc mogę go przesłać.
Z tego, co przeczytałem, mam (przynajmniej) 2 opcje:
Za pomocąBitmap.compress kompresować obraz określając jakość kompresji.
Jaki jest najlepszy wybór?
Myślałem, aby początkowo zmienić rozmiar / wysokość obrazu, dopóki szerokość lub wysokość nie przekroczą 1000px (coś jak 1024x768 lub inne), a następnie kompresować obraz z malejącą jakością, aż rozmiar pliku przekroczy 200 KB. Oto przykład:
int MAX_IMAGE_SIZE = 200 * 1024; // max final file size
Bitmap bmpPic = BitmapFactory.decodeFile(fileUri.getPath());
if ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) {
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
bmpOptions.inSampleSize = 1;
while ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) {
bmpOptions.inSampleSize++;
bmpPic = BitmapFactory.decodeFile(fileUri.getPath(), bmpOptions);
}
Log.d(TAG, "Resize: " + bmpOptions.inSampleSize);
}
int compressQuality = 104; // quality decreasing by 5 every loop. (start from 99)
int streamLength = MAX_IMAGE_SIZE;
while (streamLength >= MAX_IMAGE_SIZE) {
ByteArrayOutputStream bmpStream = new ByteArrayOutputStream();
compressQuality -= 5;
Log.d(TAG, "Quality: " + compressQuality);
bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpStream);
byte[] bmpPicByteArray = bmpStream.toByteArray();
streamLength = bmpPicByteArray.length;
Log.d(TAG, "Size: " + streamLength);
}
try {
FileOutputStream bmpFile = new FileOutputStream(finalPath);
bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpFile);
bmpFile.flush();
bmpFile.close();
} catch (Exception e) {
Log.e(TAG, "Error on saving file");
}
Czy jest na to lepszy sposób? Czy powinienem starać się używać wszystkich 2 metod, czy tylko jednej? Dzięki