Android Canvas:绘制太大的位图


87

我正在运行Ubuntu 16.04。在Android Studio上,当我尝试在模拟器中运行应用程序时,出现以下错误:

致命例外:主要流程:此处为项目名称,PID:2528 java.lang.RuntimeException:画布:尝试绘制太大(216090000bytes)的位图。在android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)在android.graphics.Canvas.drawBitmap(Canvas.java:1415)在android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:528)在android。 android.view.View.draw(View.java:17185)的widget.ImageView.onDraw(ImageView.java:1316)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
L. Swifter's


10
就我而言,将(高分辨率)启动位图从drawable移动到drawable-xxhdpi是解决方案。 我有同样的问题。我不怀疑我的启动画面是问题所在,因为启动应用程序时会显示该启动画面,但事实证明启动画面是问题所在。在我的情况下,初始屏幕具有xxhdpi分辨率,并且错误地将其放置在drawable文件夹中,而不是放在drawable-xxhdpi中。这使Android假定初始屏幕具有mdpi分辨率,并将图像缩放到所需大小的3 * 3倍,并尝试创建位图。
Zubair Rehman

它是否仅在模拟器或具有相同屏幕尺寸的设备上发生?
德米特里(Dmitry)

Answers:


200

将图像(高分辨率)可移动drawable-xxhdpi。但是在应用程序开发中,您无需使用大图像。它将增加您的APK文件大小。


6
谢谢,当我的图像只有500 kb,但分辨率太高时,也可以使用。
ashishdhiman2007

1
从API加载图像时出现此错误。在那种情况下有什么解决方案?
罗希特·辛格

2
我在Firebase Crashlytics中遇到了相同的问题,但没有提及确切的文件+行代码,因此我不知道导致此崩溃的确切映像是什么。显然,我的res文件中有很多图像,我该如何找到有问题的图像
vid rinek

15

解决方案是将图像从一个drawable/文件夹移到drawable-xxhdpi/另一个文件夹,就像其他人提到的那样。

但是重要的是还要了解为什么这个有点奇怪的建议实际上可以帮助:

原因是该drawable/文件夹存在于android的早期版本中,并且等效于drawable-mdpi。当drawable/xxhdpi设备上使用仅位于文件夹中的图像时,可能已经很大的图像将放大3倍,这在某些情况下可能导致图像的内存占用量爆炸。


2
这是否意味着drawable/如果我的资产位于其他drawable-x目录中,则可以删除目录?
Karl Taylor

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);

6

原来,问题是我们当时在应用程序上使用的主要图像。图片的实际尺寸太大,因此我们对其进行了压缩。然后,它像魅力一样运作,质量没有损失,并且该应用程序在模拟器上运行良好。


@BekaBot最初的问题是前一段时间。但是,如果我没记错的话,我们只是通过在线图像压缩器运行了图像,然后重新运行了应用程序,然后运行良好。我希望这有帮助。
弗朗西斯科

3

当我尝试通过launch_backgrgound.xml将初始屏幕添加到android应用程序时,我也遇到了这个问题。问题是解决方案。它太高,因此图像内存占用量爆炸并导致应用程序崩溃,因此是导致此错误的原因。因此,只需使用一个名为nativescript image builder的网站调整图像大小,即可获取ldpi,mdpi等所有内容,并且对我来说效果很好。


保存我的一天,同样的问题。
Abdul Basit Rishi

2

因为这个错误就像其他人说的那样是在可绘制目录中的一个大图像(1800px X 900px),所以我编辑了图像并使用photoshop按比例缩小了大小,并且可以正常工作...!


2

如果您使用Picasso将像这样更改为Glide。

删除毕加索

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

改变滑翔

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

比毕加索绘制大型位图更高效的Glide


3
我在Glide中遇到了同样的错误,通过URL加载图像,它只有2 MB图像。
Dholakiya亲王6


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);
           }


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.