2012-07-08 33 views
13

mã của tôi là:MediaStore.Images.Media.getBitmap và ra khỏi bộ nhớ lỗi

public Bitmap loadPhoto(Uri uri) { 
    Bitmap scaled = null; 
    try { 
    scalled = Bitmap.createBitmap(
     MediaStore.Images.Media.getBitmap(getContentResolver(), uri), 
     0,0,90, 90); 

    if (scaled == null) { return null; } 
    } catch(Exception e) { } 
    return scaled; 
} 

Sau này. Tôi hiển thị tỷ lệ trong ImageView. Mỗi hình ảnh xuất phát từ camera của thiết bị.

Mỗi lần tôi gặp lỗi: hết bộ nhớ sau khi tôi hiển thị ba ảnh từ máy ảnh. Làm thế nào để giải quyết điều này?

+1

tôi đã cùng một vấn đề, hãy kiểm tra liên kết này: [http://tutorials-android.blogspot.co.il/2011/11/ outofmemory-exception-when-decoding.html] (http://tutorials-android.blogspot.co.il/2011/11/outofmemory-exception-when-decoding.html) – zwebie

+1

Cũng xem hướng dẫn tuyệt vời của Chet Haase về chia tỷ lệ bitmap: http://www.youtube.com/watch?v=12cB7gnL6po –

+0

lưu ý *** TRANG NÀY LÀ RẤT RA NGÀY *** - hôm nay bạn chỉ cần thực hiện việc này: http://stackoverflow.com/a/24135522/ 294884 – Fattie

Trả lời

1

Phương pháp MediaStore.getBitmap là một phương pháp thuận tiện mà không chỉ định kích thước mẫu khi lấy bitmap. Nếu bạn đang sử dụng getBitmap (ContentResolver, Uri) và muốn sử dụng kích thước mẫu, chỉ cần sử dụng ContentResolver để lấy luồng đầu vào và giải mã bitmap như bình thường (tính toán kích thước mẫu đầu tiên, và sau đó tải nó với cỡ mẫu).

+1

Nghe có vẻ như một cách tiếp cận tốt, mã cho nó sẽ làm cho câu trả lời tốt hơn – weston

+0

@weston Google cung cấp mã mẫu này (liên quan đến tải bitmap hiệu quả) tại [link] (http://developer.android.com/training/displaying-bitmaps/load-bitmap.html) Việc sử dụng ContentResolver có thể được tìm thấy bằng cách tìm kiếm tại triển khai cho MediaStore.getBitmap. Nó thực hiện cuộc gọi đến trình phân giải nội dung theo cùng một cách –

+1

Tôi biết bạn có thể tìm thấy câu trả lời ở nơi khác, vì tôi phải thực hiện việc này vì câu trả lời chưa hoàn thành. Mọi người đọc câu trả lời này sẽ phải làm công việc chân giống nhau. Một câu trả lời Stack Overflow tốt không dựa vào các liên kết bên ngoài để hoàn thành nó. – weston

2

Đối với những người đang tìm kiếm mẫu mã:

private static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
     // height and width larger than the requested height and width. 
     while ((halfHeight/inSampleSize) >= reqHeight 
       && (halfWidth/inSampleSize) >= reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

public static Bitmap decodeSampledBitmapFromUri(Context context, Uri imageUri, int reqWidth, int reqHeight) throws FileNotFoundException { 

    // Get input stream of the image 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    InputStream iStream = context.getContentResolver().openInputStream(imageUri); 

    // First decode with inJustDecodeBounds=true to check dimensions 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(iStream, null, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeStream(iStream, null, options); 
} 
+0

bạn có thực sự thử chức năng này không? Tôi đã thử điều này và hàm decodeSampledBitmapFromUri luôn trả về null. và sau khi nghiên cứu khá dài, tôi thấy rằng bạn không thể sử dụng cùng một luồng đầu vào làm tham số cho BitmapFactory.decodeStream nhiều lần. – Dika

Các vấn đề liên quan