2010-02-19 24 views
5

Tôi cần chụp ảnh bằng máy ảnh và, nếu tùy thuộc vào kích thước hình ảnh, hãy xoay nó trước khi lưu vào bộ sưu tập.Cách làm việc với bitmap lớn. Xoay và chèn vào bộ sưu tập

Tôi đang sử dụng

Ý định imageCaptureIntent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE); imageCaptureIntent.putExtra (MediaStore.EXTRA_OUTPUT, uri); startActivityForResult (imageCaptureIntent, IMAGE_CAPTURE);

Để chụp ảnh và lưu vào tệp tạm thời.

Sau đó

Bitmap bmp = BitmapFactory.decodeFile (ImagePath);
Chuỗi str = android.provider.MediaStore.Images.Media.insertImage (cr, bmp, name, description);

Để lưu.

Đây là mã tôi đã cố gắng sử dụng để xoay bitmap

Matrix ma trận = new Matrix();
matrix.postRotate (180);
Bitmap x = Bitmap.createBitmap (bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), ma trận, đúng);
android.provider.MediaStore.Images.Media.insertImage (cr, x, name, description);

Vấn đề là tôi nhận được ngoại lệ OutOfMemoryException.

Có cách nào tốt hơn để xử lý các bitmap để tránh phá vỡ bộ nhớ không?

~ Cảm ơn bạn trước, liên quan

Trả lời

2

Tôi không nghĩ có cách nào tốt hơn để xử lý bitmap. Bạn có thể thử phân tích cú pháp dữ liệu trực tiếp từ một tập tin dưới dạng Byte [] một phần tại một thời điểm và thao tác nó theo từng phần; thật khó và có lẽ bạn sẽ kết thúc với mã rất xấu.

Tôi cũng đề nghị như sau:

  • Sử dụng android.provider.MediaStore.Images.Media.insertImage(cr, imagePath, name, description) thay vì android.provider.MediaStore.Images.Media.insertImage(cr, bmp, name, description) cách này không cần phải gọi Bitmap bmp = BitmapFactory.decodeFile(imagePath) và không bitmap sẽ được nạp vào bộ nhớ tại thời điểm đó.

  • Trong suốt mã của bạn, hãy đảm bảo không có bitmap được tải trừ khi cần. Đặt bitmap không còn cần thiết cho null và gọi cho bộ thu gom rác hoặc sử dụng bmp.recycle().

+0

bmp.recycle() wont help here cuz bạn thực sự có thể làm điều đó ngay sau khi bạn bắt OOM. Ý tôi là sau khi xoay bitmap và lưu nó. Tuy nhiên, OOM có thể xuất hiện ở thời điểm quay vì nó phải giữ 2 bitmap giống nhau trong RAM ở đó. – Stan

0

Tôi gặp vấn đề tương tự với bitmap xoay. Vấn đề ở đây:

Bitmap bmp = BitmapFactory.decodeFile(imagePath); //this is the image you want to rotate 
    // keeping in mind that you want to rotate the whole original image instead 
    // of its downscaled copy you cant use BitmapFactory downscaling ratio 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(180); 
    Bitmap x = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); 
    // the line above creates another bitmap so we have here 2 same sized bitmaps 
    // even using the same var (bmp instead of x) wont change anything here 
    // so you gonna get the OOM here 

là nó tạo 2 bitmap để họ muốn thêm RAM x2.
Kiểm tra my question and solution here. Tôi đặt cược cho ImageMagick lib.

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