关于 Bitmap.createScaledBitmap(); 重新生成新的bitmap 问题
异常信息:
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 问题相关推荐
- android bitmap 失真,Bitmap.createScaledBitmap 失真
1.问题:就算换了小图标失真 selectedBitmap = Bitmap.createScaledBitmap(selectedBitmap, (int) pieceWidth, (int) pi ...
- 03 redis新类型bitmap/hyperloglgo/GEO
亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果,就是前面讲解过的交差并等集合统计 交并差集和聚合函数的应用 排序统计 抖音视频最新评论留言的场景,请你设计一个展现列表.考察你的数据结构 ...
- C# 合并BitMap图像,生成超大bitmap
使用c#,合并多个bitMap图像 当只需要两个图像合并的时候,可以简单的使用gdi+,把两个图像画到一个画布上面实现合并bitmap. 当需要将许多bitmap合并时,由于bitmap类限制,长度或 ...
- 任意大小迷宫自动生成+BFS寻路+生成无损迷宫bitmap(.BMP)图片
目录标题 迷宫游戏 迷宫的生成 BFS寻找路线 最后的一些细枝末节 如何使用程序 链接 I TURN COFFEE INTO CODE! 800x800迷宫自动解路径 镇楼图 https://pan. ...
- mysql bitmap index_位图索引:原理(BitMap index)
位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为ta ...
- 简介Bitmap、YUV,NV21与Bitmap互转
1. Bitmap 1.1Bitmap简介 关于Bitmap,它和Drawable差不多就是一种图片,Bitmap相关的使用主要有两种: 给ImageView设置背景 当做画布来使用 分别对应下面两个 ...
- Python tkinter canvas方法的Bitmap、stipple参数和组件Bitmap属性的使用以及xbm文件
xbm文件使用纯文本描述单色位图图像,是一种被广泛使用的通用文件格式,扩展名为xbm.在图形界面(GUI)中,小的单色简单图形.图标和鼠标位图可采用xbm文件.在python中,Canvas多个方法的 ...
- php 自动生成查询密码,php自动生成新密码的两种方法
php自动生成新密码的两种方法,方法一采用的是随机种子,方法是乱序数组,异曲同工吧. 有需要的朋友可以参考下. 方法1: 代码示例: /* * php自动生成新密码自定义函数 适用环境: PHP5.2 ...
- pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column)
pandas使用extract函数根据正则表达式从dataframe指定数据列的字符串中抽取出数字并生成新的数据列(extract numbers from column and generate n ...
最新文章
- Mozilla新特性只支持https网站
- 进程间通信 —— 命名管道
- vscode 调试html页面,vscode调试HTML
- Spring中Bean的后置处理器
- 数学建模之运筹学问题
- 初探Apache Impala
- list java语法_java基础语法 List
- eclipse手动添加SVN插件
- skywalking服务端_skywalking部署
- C++_类和对象_C++继承_继承中的对象模型_占内存大小---C++语言工作笔记063
- 俄亥俄州立大学哥伦布分校计算机科学,俄亥俄州立大学哥伦布分校什么专业最好?...
- 你清楚搭建会员积分系统的目的吗?
- 17行python代码轻松搞定堆糖网所有小姐姐图片
- 博客地址迁移到http://blog.csdn.net/sunansheng
- 总结:VC小知识!(网上找的)
- 0基础快速开发口袋网盘小程序
- 开源移动设备管理(MDM)解决方案的利与弊
- 网络统考计算机实机操作,2020年国家开放大学电大考试《计算机应用基础》网络核心课形考网考作业试题及答案(完整版)(42页)-原创力文档...
- Exchange报错:452 4.3.1 Insufficient system resources
- 【嵌入式Linux应用开发】SquareLine Studio与LVGL模拟器
热门文章
- 人脸识别、文字识别背后的方法,以及研究的热点和难点
- 【两周快速入门pr】二、电影混剪——最好的剪辑练手方式
- 如何用计算机做字库,用自己的字体做电脑字库很简单,只需要耐心写完8890个汉字...
- 2023 首发 新版 抖音权重查询接口源码v2.1 附接口
- 变好的方式那么多,我只选认真。
- 老男孩python视频教程 怎么样_学习Python效果怎么样?老男孩Python课程好不好?...
- php 实现防盗链,PHP如何实现防盗链详解
- 三方流通平台:中国大数据区块链开启web5.0时代
- 在命令窗口使用sql语句操作Mysql数据库
- C#与Word的操作--转载