Полотно для Android: малювання занадто великого растрового зображення


87

Я використовую Ubuntu 16.04. І в Android Studio, коли я намагаюся запустити свою програму в емуляторі, я отримую таку помилку:

ФАТАЛЬНИЙ ВИНЯТК: основний процес: назва проекту тут, 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 10/1028) at and. 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
зразок вашого растрового зображення за допомогою цього розробника.android.com
training/displaying-bitmaps/…

10
У моєму випадку, рішенням було переміщення растрового зображення (hi-res) із сплеску на drawable-xxhdpi. У мене була та сама проблема. Я не підозрював, що проблема полягає в моєму заставному екрані, оскільки він відображається при запуску програми, але виявилося, що заставний екран є проблемою. Екран заставки у моєму випадку має роздільну здатність xxhdpi, і його помилково помістили в папку, що малюється, замість drawable-xxhdpi. Це змусило Android припустити, що заставний екран має роздільну здатність mdpi, масштабує зображення до 3 * 3 рази, ніж необхідний розмір, і намагається створити растрове зображення.
Zubair Rehman

Це відбувається лише на емуляторі або на пристрої з однаковим розміром екрану?
Дмитро

Відповіді:


200

Перемістити зображення в (Hi-Res) Drawable до витяжці-xxhdpi . Але при розробці додатків вам не потрібно використовувати велике зображення. Це збільшить розмір вашого файлу .apk.


6
Дякую, це також спрацювало, коли моє зображення було лише 500 кб, але роздільна здатність була занадто високою.
ashishdhiman2007

1
Я отримую цю помилку під час завантаження зображень з API. Що може бути рішенням у такому випадку?
Рохіт Сінгх

2
Я зіткнувся з тією ж проблемою у Firebase Crashlytics, але в ній не згадується точний файл + код рядка, тому я не знаю, яке саме зображення викликало цю аварію. Очевидно, що в моєму файлі res багато зображень, як я можу знайти проблемний
ravid rinek

15

Рішення полягає в переміщенні зображення з drawable/папки в drawable-xxhdpi/папку, як також згадували інші.

Але важливо також зрозуміти, чому ця дещо дивна пропозиція насправді допомагає:

Причина в тому, що drawable/папка існує з ранніх версій android і є еквівалентною drawable-mdpi. Коли drawable/на xxhdpiпристрої використовується зображення, яке знаходиться лише в папці , потенційно вже велике зображення збільшується в 3 рази, що в деяких випадках може спричинити вибух сліду пам'яті зображення.


2
Чи означає це, що я можу видалити drawable/каталог, якщо у мене є об’єкт в інших drawable-xкаталогах?
Карл Тейлор,

14

У мене була та сама проблема. Якщо ви спробуєте завантажити занадто велике зображення на деяких пристроях із низькою роздільною здатністю, програма згортається. Ви можете зробити кілька зображень різного розміру (hdpi, xxdpi та інші) або просто скористатися зовнішньою бібліотекою для завантаження зображень, які швидко та ефективно вирішують проблему. Я використовував бібліотеку Glide (ви можете використовувати іншу бібліотеку, таку як Пікассо).

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

6

Виявляється, проблема була основним зображенням, яке ми використовували у своєму додатку на той час. Фактичний розмір зображення був занадто великий, тому ми стиснули його. Потім це працювало як шарм, без втрати якості, і програма працювала на емуляторі.


@BekaBot Оригінальне запитання було давно. Але якщо я правильно пам’ятаю, ми просто пропустили наше зображення через онлайн-компресор зображень, а потім повторно запустили наш додаток, і тоді він працював нормально. Сподіваюся, це допоможе.
Франциско

3

У мене також виникла ця проблема, коли я намагався додати заставку до програми для Android через launch_backgrgound.xml. питанням було рішення. він був занадто високим, тому розмір пам'яті зображень вибухнув і спричинив збій програми, отже, причина цієї помилки. так що просто змініть розмір вашого зображення, використовуючи сайт, який називається Nativescript Builder зображень, тому я отримав ldpi, mdpi та всі інші, і у мене це справно працювало.


збережи мій день, те саме випуск.
Абдул Басіт Ріші

2

Оскільки ця помилка була такою, як сказали інші, велике зображення (1800px X 900px), яке було в каталозі, який можна малювати, я відредагував зображення та пропорційно зменшив розмір, використовуючи Photoshop, і воно спрацювало ... !!


2

якщо ви використовуєте Пікассо, перейдіть на Glide таким чином.

Видалити Пікассо

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

Змінити ковзання

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

Більш ефективний Glide, ніж Пікассо, намалює великий растровий малюнок


3
Я отримав ту саму помилку в Glide, завантаження зображення через URL-адресу, і це всього 2 МБ зображення.
Принц Долакія

1

Я щойно створив каталог drawable-xhdpi (Ви можете змінити його відповідно до своїх потреб) і скопіювати всі зображення, вставлені в цей каталог.


0

У моєму випадку мені довелося видалити платформу android і додати її знову. Щось застрягло, і копіювання всього мого коду в інший додаток спрацювало як шарм - звідси моя ідея очистити збірку для Android, видаливши платформу.

cordova platform remove android
cordova platform add android

Думаю, це якесь прибирання, яке доводиться робити час від часу :-(


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"

    

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.