Android Canvas: 绘制过大的位图

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

致命例外: 总部 程序: 项目名称,PID: 2528 异常: Canvas: 试图绘制太大的(216090000字节)位图。 ThrowIfCannotDrew (DisplayListCanvas.java: 260) 位图(Canvas.draBitmap)(Canvas.java: 1415) 地址: android.Graphics.draable. 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) ViewGroup.draChild (ViewGroup.java: 3727) 在 android.view. ViewGroup.patchDrew (ViewGroup.java: 3513) 在 android.view. View.updateDisplayListIfDirty (View.java: 16162) 在 android.view. View.draw (View.java: 16951) ViewGroup.draChild (ViewGroup.java: 3727) 地址: android.view. ViewGroup.patchDraw (ViewGroup.java: 3513)
等等。

我确实运行了一些箍得到我的模拟器工作,然而,需要创建一个系统链接,这样我就可以在 AMD 上运行模拟器。不知道这是不是问题的一部分。我无论如何也想不通为什么它还要继续这样下去。在我的团队中,还有其他人在同一个仿真手机和 SDK 上很好地模拟了这个项目。

178644 次浏览

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

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

对于这个错误,就像其他人说的一个大图像(1800px X 900px) ,这是在可绘制的目录,我编辑的图像和减少大小比例使用 Photoshop 和它的工作... ! !

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

这可能是格莱德的问题。当你试图加载许多图片,其中一些图片非常大的时候,使用这个:

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

如果你像这样把毕加索换成格莱德。

除掉毕加索

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

改变滑行

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

更有效的滑动比毕加索绘制大位图

我刚刚创建了目录 draable-xhdpi (您可以根据需要进行更改) ,并将所有图像复制到该目录。

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

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

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

当我试图通过 unch _ backgrgound.xml 向 android 应用程序添加启动画面时,也遇到了这个问题。问题在于决议。它太高,所以图像内存占用爆炸,导致应用程序崩溃,因此这个错误的原因。所以只要调整你的图像使用一个叫做本地脚本图像构建器的网站,所以我得到了 ldpi,mdpi 和所有其他的,它工作得很好。

这个办法对我很有效。

在 Manifest申请标记中添加这些行

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


    

如果你不想你的图像预缩放,你可以移动到 res/drawable-nodpi/文件夹。

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

尝试使用 Xml矢量资产而不是 jpg 或 png。

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

您可以使用诸如 https://svg2vector.com/之类的在线工具 png 到 xml,或者将您的图像添加到 draable-xxhdpi 文件夹。

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

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

方法二: 生成图像的所有 dpi (hdpi、 ldpi、 mdpi、 xhdpi、 xxhdpi、 xxxhdpi)并添加到可绘制文件夹(此过程将增加 APK 大小)。

方法三: 将图像添加到可绘/可绘-xxhdpi 文件夹。

所有这些方法都得到了验证。

对于毕加索的解决方案是为缩放图像添加变换。

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)