当前位置: 首页 > web >正文

【解决】trying to draw too large(147456000bytes) bitmap

异常信息

FATAL EXCEPTION: main
Process: com.sdt.sdtas, PID: 8695
java.lang.RuntimeException: Canvas: trying to draw too large(147456000bytes) bitmap.
at android.graphics.RecordingCanvas.throwIfCannotDraw(RecordingCanvas.java:266)
at android.graphics.BaseRecordingCanvas.drawBitmap(BaseRecordingCanvas.java:94)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:549)
at android.view.View.getDrawableRenderNode(View.java:23008)
at android.view.View.drawBackground(View.java:22937)
at android.view.View.draw(View.java:22711)
at android.view.View.updateDisplayListIfDirty(View.java:21594)
at android.view.View.draw(View.java:22450)
at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
at android.view.View.updateDisplayListIfDirty(View.java:21585)
at android.view.View.draw(View.java:22450)
at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
at android.view.View.updateDisplayListIfDirty(View.java:21585)
at android.view.View.draw(View.java:22450)
at android.view.ViewGroup.drawChild(ViewGroup.java:4528)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4289)
at android.view.View.draw(View.java:22722)
at com.android.internal.policy.DecorView.draw(DecorView.java:837)
at android.view.View.updateDisplayListIfDirty(View.java:21594)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:534)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:540)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:616)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4530)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4250)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3373)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2178)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8808)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1037)
at android.view.Choreographer.doCallbacks(Choreographer.java:845)
at android.view.Choreographer.doFrame(Choreographer.java:780)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7870)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

异常原因

以Bitmap默认采用的色彩模式Bitmap.Config.ARGB_8888为例;在该模式中一共有四个通道,其中A表示Alpha,R表示Red,G表示Green,B表示Blue;并且这四个通道每个各占8位即一个字节,所以合起来共计4个字节。

即 bitmap占用内存 = width x height x 4

查看源码可知安卓系统默认对图片的大小限制是100M

android/graphics/BaseRecordingCanvas.java

public static final int MAX_BITMAP_SIZE = getPanelFrameSize();private static int getPanelFrameSize() {final int DefaultSize = 100 * 1024 * 1024; // 100 MB;return Math.max(SystemProperties.getInt("ro.hwui.max_texture_allocation_size", DefaultSize),DefaultSize);
}@Override
protected void throwIfCannotDraw(Bitmap bitmap) {super.throwIfCannotDraw(bitmap);int bitmapSize = bitmap.getByteCount();if (bitmapSize > MAX_BITMAP_SIZE) {throw new RuntimeException("Canvas: trying to draw too large(" + bitmapSize + "bytes) bitmap.");}
}

解决方法

  1. 直接将工程中的大图,参考上述计算方式进行适当缩小。
  2. 如果发现工程中没有特别大的图片,可能是因为资源图放到了低分辨率的drawable中如drawable-mdpi,可以尝试将大图放到xxhdpi或者nodpi中。
http://www.xdnf.cn/news/2117.html

相关文章:

  • 当自动驾驶遇上“安全驾校”:NVIDIA如何用技术给无人驾驶赋能?
  • Redis和MQ的区别
  • WEB安全--RCE--webshell bypass
  • 数据分析岗位-相关知识
  • Nginx性能优化:从配置到缓存,全面提升Web服务器性能
  • Datawhale AI春训营二期---使用AI实现老人的点餐效果(关于task2的相关思考)
  • [FPGA Video IP] Video Processing Subsystem
  • 基于Tcp协议的应用层协议定制
  • 软件技术专业
  • CF-Hero:自动绕过CDN找真实ip地址
  • 深入理解 C++ 三法则:资源管理的关键准则
  • Linux基础IO(十一)之动态库(基础IO的最后一篇啦!)
  • 智能座舱背后的秘密:智能座舱测试如何“具身智能”
  • Golang | 自行实现并发安全的Map
  • 在 WSL 安装 OpenFOAM-12
  • 【软件工程】TCP三次握手中的SYN与ACK:核心机制详解
  • 使用ast解ob混淆时关于types的总结
  • leetcode刷题日记——简化路径
  • AI与思维模型【79】——煤气灯效应
  • 深入解析Mlivus Cloud核心架构:rootcoord组件的最佳实践与调优指南
  • 【金仓数据库征文】交通行业的国产化数据库替换之金仓数据库KingbaseES应用实践
  • 【风控】稳定性指标PSI
  • 基于STM32、HAL库的MAX31865模数转换器ADC驱动程序设计
  • 消息队列mq在Mlivus Cloud向量数据库中的关键配置与最佳实践
  • C++智能指针概念理解的面试题
  • window.location.href的用法
  • 基于 Netmiko 的网络设备自动化操作
  • 《逐梦九天:中国航天编年史》
  • QT文本框(QTextEdit)设置内容只可复制粘贴
  • C++:继承机制详解