我有一個URI圖像文件,我想減小其大小以上傳它。初始圖像文件大小取決於移動設備到移動設備(可以是2MB,可以是500KB),但我希望最終大小約爲200KB,以便我可以上傳它。
從我讀,我有(至少)2種選擇:Android - 縮小圖像文件大小
- 使用BitmapFactory.Options.inSampleSize,子採樣原始圖像,並得到一個更小的圖像;
- 使用Bitmap.compress來壓縮指定壓縮質量的圖像。
什麼是最好的選擇?
我想在最初調整大小圖像的寬度/高度,直到寬度或高度是1000像素以上(像1024x768或其他),然後用直到文件的大小是200KB以上降低質量壓縮圖象。這裏有一個例子:
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");
}
有沒有更好的辦法做到這一點?我應該嘗試繼續使用所有2種方法還是隻使用一種?謝謝
是否源圖像PNG或JPG? –
源圖像是JPG – KitKat