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ąBitmapFactory.Options.inSampleSize, aby podpróbować oryginalny obraz i uzyskać mniejszy obraz;
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

questionAnswers(2)

yourAnswerToTheQuestion