2014-06-10 14 views
14

Nếu bạn có một Uri và bạn cần Bitmap, bạn có thể về mặt lý thuyết làm điều nàykích thước Pre-đoán của Bitmap từ Uri thực tế, trước khi bốc quy mô

Bitmap troublinglyLargeBmp = 
    MediaStore.Images.Media.getBitmap(
     State.mainActivity.getContentResolver(), theUri); 

nhưng nó sẽ sụp đổ mọi thời gian,

vì vậy bạn làm điều này .........

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 4; 

AssetFileDescriptor fileDescriptor =null; 
fileDescriptor = 
    State.mainActivity.getContentResolver().openAssetFileDescriptor(theUri, "r"); 

Bitmap actuallyUsableBitmap 
    = BitmapFactory.decodeFileDescriptor(
    fileDescriptor.getFileDescriptor(), null, options); 

Utils.Log("'4-sample' method bitmap ... " 
    +actuallyUsableBitmap.getWidth() +" " 
    +actuallyUsableBitmap.getHeight()); 

đó là tuyệt vời và là giải pháp làm việc.

Thông báo các yếu tố của "tứ đại gia" mà có xu hướng làm việc tốt, trong điều kiện hiện nay (năm 2014) với kích thước máy ảnh tiêu biểu, vv Tuy nhiên, nó sẽ là tốt nhất để đoán hoặc tìm hiểu chính xác kích thước của dữ liệu hình ảnh tại theUri và sau đó sử dụng thông tin đó, chọn yếu tố thông minh một cách thông minh.

Tóm lại, cách chọn đúng hệ số tỷ lệ khi bạn tải Uri?

Chuyên gia Android, đây có phải là vấn đề nổi tiếng không, có giải pháp nào không? Cảm ơn bạn bè iOS-> Android của bạn! :)

Trả lời

22

Xem hướng dẫn Android về handling large bitmaps.

Cụ thể phần này:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 
BitmapFactory.decodeResource(getResources(), R.id.myimage, options); 
int imageHeight = options.outHeight; 
int imageWidth = options.outWidth; 
String imageType = options.outMimeType; 

EDIT

Trong trường hợp của bạn, bạn sẽ thay thế dòng decodeResource với:

BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), null, options); 
Các vấn đề liên quan