异常信息:

    java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@a693a8fat android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1271)at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:257)at android.graphics.Canvas.drawBitmap(Canvas.java:1415)at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545)at android.widget.ImageView.onDraw(ImageView.java:1268)at android.view.View.draw(View.java:17071)at android.view.View.updateDisplayListIfDirty(View.java:16053)at android.view.View.draw(View.java:16837)at android.view.ViewGroup.drawChild(ViewGroup.java:3764)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)at android.view.View.updateDisplayListIfDirty(View.java:16048)at android.view.View.draw(View.java:16837)

先看createScaledBitmap()源码:

    public static Bitmap createScaledBitmap(@NonNull Bitmap src, int dstWidth, int dstHeight,boolean filter) {Matrix m = new Matrix();final int width = src.getWidth();final int height = src.getHeight();if (width != dstWidth || height != dstHeight) {final float sx = dstWidth / (float) width;final float sy = dstHeight / (float) height;m.setScale(sx, sy);}return Bitmap.createBitmap(src, 0, 0, width, height, m, filter);}

实际是调用了 createBitmap() ,部分源码如下:

    public static Bitmap createBitmap(@NonNull Bitmap source, int x, int y, int width, int height,@Nullable Matrix m, boolean filter) {checkXYSign(x, y);checkWidthHeight(width, height);if (x + width > source.getWidth()) {throw new IllegalArgumentException("x + width must be <= bitmap.width()");}if (y + height > source.getHeight()) {throw new IllegalArgumentException("y + height must be <= bitmap.height()");}if (source.isRecycled()) {throw new IllegalArgumentException("cannot use a recycled source in createBitmap");}// check if we can just return our argument unchangedif (!source.isMutable() && x == 0 && y == 0 && width == source.getWidth() &&height == source.getHeight() && (m == null || m.isIdentity())) {return source;}

源码重点:当以下条件成立时 ,返回原bitmap,就不再生成新的bitmap

// check if we can just return our argument unchangedif (!source.isMutable() && x == 0 && y == 0 && width == source.getWidth() &&height == source.getHeight() && (m == null || m.isIdentity())) {return source;}

导致问题出现的原因:由于createScaleBitmap 返回的是原bitmap ,且并没有重新生成新的bitmap ,而后面做了bitmap回收处理,导致异常错误

            Bitmap newBp = Bitmap.createScaledBitmap(tmpBitmap, width,height, true);tmpBitmap.recycle();tmpBitmap=null;imageView.setImageBitmap(newBp);

解决方案:只需要把上面的条件改为不成立即可,强制生成新bitmap ,或者也可以做width,height 判断处理

如:在生成原bitmap 时 使用

BitmapFactory.Options options=new BitmapFactory.Options();
options.inMutable=true;

关于 Bitmap.createScaledBitmap(); 重新生成新的bitmap 问题相关推荐

  1. android bitmap 失真,Bitmap.createScaledBitmap 失真

    1.问题:就算换了小图标失真 selectedBitmap = Bitmap.createScaledBitmap(selectedBitmap, (int) pieceWidth, (int) pi ...

  2. 03 redis新类型bitmap/hyperloglgo/GEO

    亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果,就是前面讲解过的交差并等集合统计 交并差集和聚合函数的应用 排序统计 抖音视频最新评论留言的场景,请你设计一个展现列表.考察你的数据结构 ...

  3. C# 合并BitMap图像,生成超大bitmap

    使用c#,合并多个bitMap图像 当只需要两个图像合并的时候,可以简单的使用gdi+,把两个图像画到一个画布上面实现合并bitmap. 当需要将许多bitmap合并时,由于bitmap类限制,长度或 ...

  4. 任意大小迷宫自动生成+BFS寻路+生成无损迷宫bitmap(.BMP)图片

    目录标题 迷宫游戏 迷宫的生成 BFS寻找路线 最后的一些细枝末节 如何使用程序 链接 I TURN COFFEE INTO CODE! 800x800迷宫自动解路径 镇楼图 https://pan. ...

  5. mysql bitmap index_位图索引:原理(BitMap index)

    位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为ta ...

  6. 简介Bitmap、YUV,NV21与Bitmap互转

    1. Bitmap 1.1Bitmap简介 关于Bitmap,它和Drawable差不多就是一种图片,Bitmap相关的使用主要有两种: 给ImageView设置背景 当做画布来使用 分别对应下面两个 ...

  7. Python tkinter canvas方法的Bitmap、stipple参数和组件Bitmap属性的使用以及xbm文件

    xbm文件使用纯文本描述单色位图图像,是一种被广泛使用的通用文件格式,扩展名为xbm.在图形界面(GUI)中,小的单色简单图形.图标和鼠标位图可采用xbm文件.在python中,Canvas多个方法的 ...

  8. php 自动生成查询密码,php自动生成新密码的两种方法

    php自动生成新密码的两种方法,方法一采用的是随机种子,方法是乱序数组,异曲同工吧. 有需要的朋友可以参考下. 方法1: 代码示例: /* * php自动生成新密码自定义函数 适用环境: PHP5.2 ...

  9. pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column)

    pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column and generate n ...

最新文章

  1. Mozilla新特性只支持https网站
  2. 进程间通信 —— 命名管道
  3. vscode 调试html页面,vscode调试HTML
  4. Spring中Bean的后置处理器
  5. 数学建模之运筹学问题
  6. 初探Apache Impala
  7. list java语法_java基础语法 List
  8. eclipse手动添加SVN插件
  9. skywalking服务端_skywalking部署
  10. C++_类和对象_C++继承_继承中的对象模型_占内存大小---C++语言工作笔记063
  11. 俄亥俄州立大学哥伦布分校计算机科学,俄亥俄州立大学哥伦布分校什么专业最好?...
  12. 你清楚搭建会员积分系统的目的吗?
  13. 17行python代码轻松搞定堆糖网所有小姐姐图片
  14. 博客地址迁移到http://blog.csdn.net/sunansheng
  15. 总结:VC小知识!(网上找的)
  16. 0基础快速开发口袋网盘小程序
  17. 开源移动设备管理(MDM)解决方案的利与弊
  18. 网络统考计算机实机操作,2020年国家开放大学电大考试《计算机应用基础》网络核心课形考网考作业试题及答案(完整版)(42页)-原创力文档...
  19. Exchange报错:452 4.3.1 Insufficient system resources
  20. 【嵌入式Linux应用开发】SquareLine Studio与LVGL模拟器

热门文章

  1. 人脸识别、文字识别背后的方法,以及研究的热点和难点
  2. 【两周快速入门pr】二、电影混剪——最好的剪辑练手方式
  3. 如何用计算机做字库,用自己的字体做电脑字库很简单,只需要耐心写完8890个汉字...
  4. 2023 首发 新版 抖音权重查询接口源码v2.1 附接口
  5. 变好的方式那么多,我只选认真。
  6. 老男孩python视频教程 怎么样_学习Python效果怎么样?老男孩Python课程好不好?...
  7. php 实现防盗链,PHP如何实现防盗链详解
  8. 三方流通平台:中国大数据区块链开启web5.0时代
  9. 在命令窗口使用sql语句操作Mysql数据库
  10. C#与Word的操作--转载