Android Canvas: рисование слишком большого растрового изображения

87

Я использую Ubuntu 16.04. А в Android Studio, когда я пытаюсь запустить свое приложение в эмуляторе, я получаю следующую ошибку:

FATAL EXCEPTION: основной процесс: здесь название проекта, PID: 2528 java.lang.RuntimeException: Canvas: попытка нарисовать слишком большое (216090000 байт) растровое изображение. в android.view.DisplayListCanvas.throwIfCannotDraw (DisplayListCanvas.java:260) в android.graphics.Canvas.drawBitmap (Canvas.java:1415) в android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java. 528) в android. widget.ImageView.onDraw (ImageView.java:1316) на android.view.View.draw (View.java:17185) на android.view.View.updateDisplayListIfDirty (View.java:16167) на android.view.View.draw (View.java:16951) в android.view.ViewGroup.drawChild (ViewGroup.java:3727) в android.view.ViewGroup.dispatchDraw (ViewGroup.java:
так далее...

Мне пришлось пройти через некоторые обручи, чтобы заставить мой эмулятор работать, однако необходимо было создать символическую ссылку, чтобы я мог запустить эмулятор на AMD. Не уверен, что это часть проблемы. И хоть убей, я не могу понять, почему он продолжает это делать. В моей группе есть другие, которые отлично эмулируют проект на том же эмулированном телефоне и SDK.

Франциско
источник
вы пробовали читать растровое изображение в меньшем размере с помощью BitmapOption.inSampleSize?
Л. Свифтер
1
пример вашего растрового изображения с помощью этого developer.android.com/training/displaying-bitmaps/…
Nishant Verma
10
В моем случае решением было перемещение растрового изображения всплеска (высокого разрешения) из drawable в drawable-xxhdpi. У меня такая же проблема. Я не подозревал, что проблема в моем экране-заставке, поскольку он отображается при запуске приложения, но оказалось, что проблема в экране-заставке. Экран-заставка в моем случае имеет разрешение xxhdpi, и он был ошибочно помещен в папку drawable вместо drawable-xxhdpi. Это заставило Android предположить, что экран-заставка имеет разрешение mdpi, масштабировать изображение в 3 * 3 раза от требуемого размера и попытаться создать растровое изображение.
Зубаир Рехман
Это происходит только на эмуляторе или на устройстве с таким же размером экрана?
Дмитрий

Ответы:

200

Переместите изображение в ( в высоком разрешении) drawable на drawable-xxhdpi . Но при разработке приложений вам не нужно использовать большое изображение. Это увеличит размер вашего APK-файла.

Md Имран Чоудхури
источник
6
Спасибо, это тоже сработало, когда мое изображение было всего 500 КБ, но разрешение было слишком высоким.
ashishdhiman2007
1
Я получаю эту ошибку при загрузке изображений из API. Что может быть в таком случае решением?
Рохит Сингх,
2
Я столкнулся с той же проблемой в Firebase Crashlytics, но в нем не упоминается точный код файла + строки, поэтому я не знаю, какое именно изображение вызывает этот сбой. Очевидно, что в моем файле res много изображений, как мне найти проблемное?
Равид Ринек
15

Решение состоит в том, чтобы переместить изображение из drawable/папки в drawable-xxhdpi/папку, как уже упоминали другие.

Но важно также понять, почему это несколько странное предложение действительно помогает:

Причина в том, что drawable/папка существует с ранних версий Android и эквивалентна drawable-mdpi. Когда изображение, которое находится только в drawable/папке, используется на xxhdpiустройстве, потенциально уже большое изображение масштабируется в 3 раза, что в некоторых случаях может привести к увеличению объема памяти, занимаемой изображением.

Nace
источник
2
Означает ли это, что я могу удалить drawable/каталог, если у меня есть актив в других drawable-xкаталогах?
Карл Тейлор
14

У меня такая же проблема. Если вы попытаетесь загрузить слишком большое изображение на некоторых устройствах с низким разрешением, приложение рухнет. Вы можете сделать несколько изображений разных размеров (hdpi, xxdpi и др.) Или просто использовать внешнюю библиотеку для загрузки изображений, которые решат проблему быстро и эффективно. Я использовал библиотеку Glide (вы можете использовать другую библиотеку, например, Picasso).

    panel_IMG_back = (ImageView) findViewById(R.id.panel_IMG_back);
    Glide
            .with(this)
            .load(MyViewUtils.getImage(R.drawable.wallpaper)
            .into(panel_IMG_back);
Парень4444
источник
6

Оказывается, проблема заключалась в основном изображении, которое мы использовали в то время в нашем приложении. Фактический размер изображения был слишком большим, поэтому мы его сжали. Затем он работал как шарм, без потери качества, и приложение отлично работало на эмуляторе.

Франциско
источник
@BekaBot Оригинальный вопрос был задан некоторое время назад. Но если я правильно помню, мы просто пропустили наше изображение через онлайн-компрессор изображений, а затем повторно запустили наше приложение, и затем оно заработало нормально. Надеюсь, это поможет.
Франциско
3

У меня также была эта проблема, когда я пытался добавить заставку в приложение для Android через launch_backgrgound.xml. проблема была в решении. он был слишком высоким, поэтому объем памяти изображений увеличился и вызвала сбой приложения, отсюда и причина этой ошибки. так что просто измените размер изображения с помощью сайта под названием nativescript image builder, чтобы я получил ldpi, mdpi и все остальное, и у меня все сработало.

Williamjnrkdd
источник
Спаси мой день, та же проблема.
Абдул Басит Риши,
2

Поскольку эта ошибка была, как и другие, большим изображением (1800px X 900px), которое находилось в каталоге с возможностью рисования, я отредактировал изображение и пропорционально уменьшил размер с помощью Photoshop, и это сработало ... !!

Ishimwe Aubain Consolateur
источник
2

если вы используете Picasso, измените его на Glide вот так.

Удалить пикассо

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

Изменить скольжение

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

Более эффективное рисование Glide, чем Picasso, для больших растровых изображений

Дениз
источник
3
У меня такая же ошибка в Glide, загрузка изображения через URL, а это всего 2 МБ изображения.
Принц Дхолакия,
1

Я только что создал каталог drawable-xhdpi (вы можете изменить его в соответствии с вашими потребностями) и скопировал все изображения в этот каталог.

Сураб Чаудхари
источник
0

В моем случае мне пришлось удалить платформу Android и добавить ее снова. Что-то застряло, и копирование всего моего кода в другое приложение сработало как шарм - отсюда и моя идея очистить сборку для Android, удалив платформу.

cordova platform remove android
cordova platform add android

Думаю, это какая-то уборка, которую нужно делать время от времени :-(

Pieroxy
источник
0

Это может быть проблемой с Glide. Используйте это, когда вы пытаетесь загрузить много изображений, и некоторые из них очень большие:

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

Это решение сработало для меня.

Добавьте эти строки в свой тег приложения Manifest

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

    
Абдул Басит Риши
источник