ChatGPT解决这个技术问题 Extra ChatGPT

Android Canvas:绘制过大的位图

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

致命异常:主进程:这里的项目名称,PID:2528 java.lang.RuntimeException:画布:试图绘制太大(216090000字节)位图。在 android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260) 在 android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:528) 在 android.graphics.Canvas.drawBitmap(Canvas.java:1415) 在 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.View.ViewGroup.drawChild(ViewGroup.java:3727) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513) 在 android.view.View.updateDisplayListIfDirty(View.java: 16162)在 android.view.View.draw(View.java:16951) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3727) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513) 在等。 ..

我确实必须通过一些箍来让我的模拟器工作但是,需要创建一个符号链接,以便我可以在 AMD 上运行模拟器。不确定这是否是问题的一部分。对于我的一生,我无法弄清楚为什么它会继续这样做。在我的小组中,还有其他人可以在相同的模拟手机和 SDK 上很好地模拟该项目。

您是否尝试使用 BitmapOption.inSampleSize 读取较小尺寸的位图?
使用此 developer.android.com/training/displaying-bitmaps/… 对您的位图进行采样
我的情况是,将(高分辨率)启动位图从 drawable 移动到 drawable-xxhdpi 是解决方案。我有同样的问题。我没有怀疑我的启动画面是问题所在,因为它是在应用程序启动时显示的,但事实证明启动画面是问题所在。在我的例子中,启动画面的分辨率为 xxhdpi,并且它被错误地放置在 drawable 文件夹中,而不是 drawable-xxhdpi。这使得 Android 假设初始屏幕具有 mdpi 分辨率并将图像缩放到所需大小的 3*3 倍并尝试创建位图。
它是否只发生在模拟器或具有相同屏幕尺寸的设备上?

S
Striezel

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


谢谢,当我的图像只有 500 kb 时,这也有效,但分辨率太高了。
从 API 加载图像时出现此错误。在这种情况下有什么解决方案?
我在 Firebase Crashlytics 中遇到了同样的问题,但它没有提到确切的文件+行代码,所以我不知道导致这次崩溃的确切图像是什么。显然我的res文件中有很多图像,我该如何找到有问题的图像
你挽救了我的一天,顺便说一句,一旦退出博览会,我在 react native 中遇到了同样的错误,可能会对某些人有所帮助。
这也发生在我使用 RecyclerView 滚动图片时。对我来说幸运的是,我可以选择 HI 或低清晰度 URL。使用所有低 Def URL 也为 RecyclerView 解决了这个问题。模拟器和设备都会出现问题。
N
Nace

解决方案是将图像从 drawable/ 文件夹移动到 drawable-xxhdpi/ 文件夹,正如其他人所提到的。

但同样重要的是要理解为什么这个有点奇怪的建议实际上有帮助:

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


这是否意味着如果我在其他 drawable-x 目录中有资产,我可以删除 drawable/ 目录?
A
Abdul Basit Rishi

这个解决方案对我有用。

在您的清单应用程序标签中添加这些行

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

    

为什么android:hardwareAccelerated false?
@DynoCris 由于启用硬件加速所需的资源增加,您的应用程序将消耗更多 RAM。
G
Guy4444

我有同样的问题。如果您尝试在某些低分辨率设备上上传太大的图像,应用程序将崩溃。您可以制作多个不同大小的图像(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);

F
Francisco

原来问题出在我们当时在应用程序上使用的主图像上。图片的实际尺寸太大,所以我们压缩了它。然后它就像一个魅力,没有质量损失,应用程序在模拟器上运行良好。


@BekaBot 最初的问题来自不久前。但如果我没记错的话,我们只是通过在线图像压缩器运行我们的图像,然后重新运行我们的应用程序,然后它运行良好。我希望这有帮助。
e
elpidaguy

这个问题可以通过以下3种方法解决:

方法 1:通过将图像添加到 res/drawable-nodpi 文件夹中(这样做不会预先缩放您的图像)。

方法二:生成图片的所有dpi(hdpi,ldpi,mdpi,xhdpi,xxhdpi,xxxhdpi)并添加到drawable文件夹中。 (这个过程会增加 APK 的大小)。

方法 3:将图像添加到 drawable/drawable-xxhdpi 文件夹。

所有这些方法都经过验证。


I
Ishimwe Aubain Consolateur

因为这个错误就像其他人说的一个大图像(1800px X 900px)在drawable目录中,我编辑了图像并使用photoshop按比例缩小了它的大小,它工作......!!


D
Deniz

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

删除毕加索

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

改变滑行

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

Glide 比 Picasso 绘制到大位图更有效


我在 Glide 中遇到了同样的错误,通过 URL 加载图像,它只有 2 MB 的图像。
w
williamjnrkdd

当我尝试通过 launch_backgrgound.xml 向 android 应用程序添加启动画面时,我也遇到了这个问题。问题是决议。它太高了,所以图像内存占用爆炸并导致应用程序崩溃,因此导致此错误。所以只需使用一个名为 nativescript image builder 的网站调整图像大小,这样我就得到了 ldpi、mdpi 和所有其他文件,它对我来说很好用。


拯救我的一天,同样的问题。
J
Jasper Vergeer

如果您不希望对图像进行预缩放,可以将其移动到 res/drawable-nodpi/ 文件夹。

更多信息:https://developer.android.com/training/multiscreen/screendensities#DensityConsiderations


S
Sourabh Chaudhary

我刚刚创建了目录drawable-xhdpi(您可以根据需要更改它)并将所有图像复制粘贴到该目录。


Z
Zoe stands with Ukraine

这可能是 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);
           }

J
Jayant Kapila

尝试使用 xml 或矢量资源而不是 jpg 或 png。

原因在异常名称本身中非常明显,即资源的分辨率太大而无法呈现。

您可以使用 https://svg2vector.com/ 等在线工具将图像 png 转换为 xml,或者将图像添加到 drawable-xxhdpi 文件夹。


В
Вадим Гарань

Picasso 的解决方案是添加转换以调整图像大小。

class ResizeTransformation(private val maxSize: Int) : Transformation {
    override fun transform(source: Bitmap?): Bitmap? {
        var result:Bitmap? = null

        if (source != null) {
            var width = source.width
            var height = source.height

            val bitmapRatio = width.toFloat() / height.toFloat()

            if (bitmapRatio > 1) {
                width = maxSize;
                height = (width / bitmapRatio).toInt()
            } else {
                height = maxSize;
                width = (height * bitmapRatio).toInt()
            }

            result = Bitmap.createScaledBitmap(source, width, height, true)
            source.recycle()

        }

        return result
    }


    override fun key() = "resize()"
}

利用:

Picasso.get()
        .load(url)
        .transform(ResizeTransformation(2400)) //FHD+ resolution
        .into(view)

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅