Tôi có tệp hình ảnh URI và tôi muốn giảm kích thước tệp của nó để tải lên. Kích thước tệp hình ảnh ban đầu phụ thuộc từ thiết bị di động đến thiết bị di động (có thể là 2MB có thể là 500KB), nhưng tôi muốn kích thước cuối cùng khoảng 200KB, để tôi có thể tải lên.
Từ những gì tôi đọc, tôi có (ít nhất) 2 lựa chọn:Android - Giảm kích thước tệp hình ảnh
- Sử dụng BitmapFactory.Options.inSampleSize, để subsample ảnh gốc và có được một hình ảnh nhỏ hơn;
- Sử dụng Bitmap.compress để nén hình ảnh chỉ định chất lượng nén.
Lựa chọn tốt nhất là gì?
Tôi đã suy nghĩ ban đầu thay đổi kích thước hình ảnh chiều rộng/chiều cao cho đến khi chiều rộng hoặc chiều cao là trên 1000px (cái gì đó như 1024x768 hoặc những người khác), sau đó nén hình ảnh với chất lượng giảm cho đến khi kích thước tập tin là trên 200KB. Dưới đây là ví dụ:
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");
}
Có cách nào tốt hơn để làm điều đó không? Tôi có nên cố gắng tiếp tục sử dụng tất cả 2 phương pháp hay chỉ một phương pháp? Cảm ơn
liệu hình ảnh nguồn png hoặc jpg? –
Hình ảnh nguồn là JPG – KitKat