Android Canvas: vẽ bitmap quá lớn


87

Tôi đang chạy Ubuntu 16.04. Và trên Android Studio khi tôi cố gắng chạy ứng dụng của mình trong trình giả lập, tôi gặp lỗi sau:

FATAL EXCEPTION: quá trình chính: tên dự án tại đây, PID: 2528 java.lang.RuntimeException: Canvas: cố gắng vẽ bitmap quá lớn (216090000byte). tại android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) tại android.graphics.Canvas.drawBitmap (Canvas.java:1415) tại android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:528) tại android. widget.ImageView.onDraw (ImageView.java:1316) tại android.view.View.draw (View.java:17185) tại android.view.View.updateDisplayListIfDirty (View.java:16167) tại android.view.View.draw (View.java:16951) tại android.view.ViewGroup.drawChild (ViewGroup.java:3727) tại android.view.ViewGroup.dispatchDraw (ViewGroup.java:
Vân vân...

Tôi đã phải chạy qua một số vòng để trình mô phỏng của tôi hoạt động, tuy nhiên, tôi cần tạo liên kết sym-link để tôi có thể chạy trình giả lập trên AMD. Không chắc chắn nếu đây là một phần của vấn đề. Và đối với cuộc sống của tôi, tôi không thể hiểu tại sao nó tiếp tục làm điều này. Trong nhóm của tôi, có những người khác mô phỏng dự án tốt trên cùng một điện thoại và SDK được mô phỏng.


bạn đã thử đọc bitmap ở kích thước nhỏ hơn bằng cách sử dụng BitmapOption.inSampleSizechưa?
L. Swifter

1
lấy mẫu bitmap của bạn bằng cách sử dụng developer.android.com/training/displaying-bitmaps/…
Nishant Verma

10
Trong trường hợp của tôi, chuyển bitmap giật gân (độ phân giải cao) từ drawable sang drawable-xxhdpi là giải pháp. Tôi đã từng gặp vấn đề tương tự. Tôi không nghi ngờ màn hình giật gân của mình là vấn đề, vì nó được hiển thị khi ứng dụng được khởi động, nhưng hóa ra màn hình giật gân mới là vấn đề. Màn hình giật gân trong trường hợp của tôi có độ phân giải xxhdpi và nó đã bị đặt nhầm vào thư mục có thể vẽ, thay vì có thể vẽ-xxhdpi. Điều này khiến Android cho rằng màn hình giật gân có độ phân giải mdpi và chia tỷ lệ hình ảnh thành 3 * 3 lần kích thước yêu cầu và cố gắng tạo một bitmap.
Zubair Rehman,

Nó chỉ xảy ra trên trình giả lập hoặc trên thiết bị có cùng kích thước màn hình?
Dmitry

Câu trả lời:


200

Di chuyển hình ảnh của bạn trong drawable (độ phân giải cao) sang drawable-xxhdpi . Nhưng trong phát triển ứng dụng, bạn không cần phải sử dụng hình ảnh lớn. Nó sẽ tăng kích thước tệp APK của bạn.


6
Cảm ơn, điều đó cũng hiệu quả khi hình ảnh của tôi chỉ có 500 kb, nhưng độ phân giải quá cao.
ashishdhiman2007

1
Tôi gặp lỗi này khi tải hình ảnh từ API. Điều gì có thể là một giải pháp trong trường hợp đó?
Rohit Singh

2
Tôi đã gặp vấn đề tương tự trong Firebase Crashlytics nhưng nó không đề cập đến tệp + mã dòng chính xác, Vì vậy, tôi không biết hình ảnh chính xác gây ra sự cố này là gì. Rõ ràng là có rất nhiều hình ảnh trong tệp res của tôi, làm thế nào tôi có thể xác định vị trí có vấn đề
ravid Rinek

15

Giải pháp là di chuyển hình ảnh từ drawable/thư mục này sang drawable-xxhdpi/thư mục khác, như những người khác đã đề cập.

Nhưng điều quan trọng là phải hiểu tại sao gợi ý hơi kỳ lạ này thực sự giúp ích:

Lý do là drawable/thư mục tồn tại từ các phiên bản đầu tiên của android và tương đương với drawable-mdpi. Khi một hình ảnh chỉ nằm trong drawable/thư mục được sử dụng trên xxhdpithiết bị, hình ảnh có khả năng đã lớn sẽ được nâng cấp theo hệ số 3, sau đó, trong một số trường hợp, có thể gây nổ bộ nhớ của hình ảnh.


2
Điều này có nghĩa là tôi có thể xóa drawable/thư mục nếu tôi có nội dung trong các drawable-xthư mục khác ?
Karl Taylor

14

Tôi đã từng gặp vấn đề tương tự. Nếu bạn cố gắng tải lên hình ảnh quá lớn trên một số thiết bị có độ phân giải thấp, ứng dụng sẽ bị sập. Bạn có thể tạo một số hình ảnh có kích thước khác nhau (hdpi, xxdpi và hơn thế nữa) hoặc chỉ cần sử dụng thư viện bên ngoài để tải hình ảnh giải quyết vấn đề một cách nhanh chóng và hiệu quả. Tôi đã sử dụng thư viện Glide (bạn có thể sử dụng một thư viện khác như Picasso).

    panel_IMG_back = (ImageView) findViewById(R.id.panel_IMG_back);
    Glide
            .with(this)
            .load(MyViewUtils.getImage(R.drawable.wallpaper)
            .into(panel_IMG_back);

6

Hóa ra vấn đề là hình ảnh chính mà chúng tôi sử dụng trên ứng dụng của mình vào thời điểm đó. Kích thước thực của hình ảnh quá lớn, vì vậy chúng tôi đã nén nó lại. Sau đó, nó hoạt động như một sự quyến rũ, không giảm chất lượng và ứng dụng chạy tốt trên trình giả lập.


@BekaBot Câu hỏi gốc đã có từ một lúc trước. Nhưng nếu tôi nhớ chính xác, chúng tôi chỉ chạy hình ảnh của mình thông qua một máy nén hình ảnh trực tuyến, sau đó chạy lại ứng dụng của chúng tôi và sau đó nó chạy tốt. Tôi hi vọng cái này giúp được.
Francisco

3

Tôi cũng gặp sự cố này khi cố gắng thêm màn hình giật gân vào ứng dụng android thông qua launc_backgrgound.xml. vấn đề là giải pháp. nó quá cao nên bộ nhớ hình ảnh bị nổ và gây ra lỗi ứng dụng do đó là lý do cho lỗi này. vì vậy chỉ cần thay đổi kích thước hình ảnh của bạn bằng cách sử dụng trang web có tên là trình tạo hình ảnh bản địa chỉ để tôi có ldpi, mdpi và tất cả phần còn lại và nó hoạt động tốt đối với tôi.


lưu ngày của tôi, cùng một vấn đề.
Abdul Basit Rishi

2

Đối với lỗi này giống như những người khác nói một hình ảnh lớn (1800px X 900px) nằm trong thư mục có thể vẽ được, tôi đã chỉnh sửa hình ảnh và giảm kích thước tương ứng bằng cách sử dụng photoshop và nó đã hoạt động ... !!


2

nếu bạn sử dụng Picasso, hãy thay đổi thành Glide như thế này.

Xóa picasso

Picasso.get().load(Uri.parse("url")).into(imageView)

Thay đổi Lướt

Glide.with(context).load("url").into(imageView)

Lướt hiệu quả hơn Picasso vẽ thành ảnh bitmap lớn


3
Tôi cũng gặp lỗi này trong Glide, tải hình ảnh qua URL và nó chỉ có 2 MB hình ảnh.
Hoàng tử Dholakiya

1

Tôi vừa tạo thư mục drawable-xhdpi (Bạn có thể thay đổi nó theo nhu cầu của mình) và sao chép dán tất cả các hình ảnh vào thư mục đó.


0

Trong trường hợp của tôi, tôi đã phải xóa nền tảng Android và thêm lại nó. Một cái gì đó đã bị mắc kẹt và việc sao chép tất cả mã của tôi vào một ứng dụng khác hoạt động như một sự quyến rũ - do đó ý tưởng của tôi về việc dọn dẹp bản dựng cho Android bằng cách xóa nền tảng.

cordova platform remove android
cordova platform add android

Tôi đoán đó là một số kiểu dọn dẹp mà bạn phải thực hiện theo thời gian :-(


0

Đây có thể là một vấn đề với Glide. Sử dụng điều này khi bạn đang cố gắng tải nhiều hình ảnh và một số hình ảnh rất lớn:

Glide.load("your image path")
                       .transform(
                               new MultiTransformation<>(
                                       new CenterCrop(),
                                       new RoundedCorners(
                                               holder.imgCompanyLogo.getResources()
                                                       .getDimensionPixelSize(R.dimen._2sdp)
                                       )
                               )
                       )
                       .error(R.drawable.ic_nfs_default)
                       .into(holder.imgCompanyLogo);
           }

0

Giải pháp này đã làm việc cho tôi.

Thêm các dòng này vào thẻ ứng dụng Tệp kê khai của bạn

android:largeHeap="true"
android:hardwareAccelerated="false"

    

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.