Android_Bitmap压缩杂谈
来源:互联网 发布:部落冲突弓箭女皇数据 编辑:程序博客网 时间:2024/06/05 23:46
情况一:图片太大,因为手机资源的稀缺,如果每个图片都很大,很容易出现OOM的情况。所以,适当对图片的质量进行压缩还是有必要的。
实习代码如下:
private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream target_baos= new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, target_baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; while ( target_baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩 target_baos.reset();//重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, target_baos);//这里压缩options%,把压缩后的数据存放到baos中 options -= 10;//每次都减少10 } ByteArrayInputStream isBm = new ByteArrayInputStream(target_baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 return bitmap; }
通过如上方法可以将Bitmap大小进行压缩,有利于APP的内存利用。
情况二:图片尺寸过大,将Bitmap缩放适当尺寸,已完成不同屏幕的适配。
方法1:利用矩阵缩放,代码如下:
//获取屏幕的宽高 DisplayMetrics metrics = new DisplayMetrics(); ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = metrics.widthPixels; int height = metrics.heightPixels; //标准尺寸屏幕的比例关系,计算出该屏幕下图片的尺寸,并设置一个最大值,放置在另类手机适配出现问题。 int cellWidth = (int)((180.0f/1080.0f)*width); if (cellWidth >240) cellWidth = 240; int bitmapWidth = getBitmapFor(R.mipmap.pointer_pw).getWidth(); int bitmapHeight = getBitmapFor(R.mipmap.pointer_pw).getHeight(); float scale = (float)cellWidth/(float)bitmapWidth;//根据目标尺寸和原始图片尺寸计算比例 Matrix matrix = new Matrix(); matrix.postScale(scale,scale); // 得出最后的bitmap mBitmapBtnDefault = Bitmap.createBitmap(getBitmapFor(R.mipmap.pointer_pw),0,0,bitmapWidth,bitmapHeight,matrix,true);
方法2:利用BitmapFactory.Options 完成缩放
private Bitmap getimage(String srcPath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); //开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空 newOpts.inJustDecodeBounds = false; int factor = 4; newOpts.inSampleSize = factor;//设置缩放比例,实际为所设值得倒数 //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 bitmap = BitmapFactory.decodeFile(srcPath, newOpts); return bitmap;//压缩好比例大小后再进行质量压缩 }
0 0
- Android_Bitmap压缩杂谈
- android_Bitmap
- Android_Bitmap你到底多大
- Android_Bitmap的高效加载
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- 杂谈
- js提交表单kindeditor编辑器textarea为空解决办法
- Spark中文手册9:spark GraphX编程指南(2)
- vs2015 cordova 检测不到 node.js依赖项的问题
- 线程同步:何时互斥锁不够,还需要条件变量?
- 使用rsync备份engine服务器
- Android_Bitmap压缩杂谈
- Eclipse字体等设置
- Android成长之路-LayoutInflater和inflate的用法
- 第16周项目1-验证算法(4)快速排序
- Codeforces 383C Propagating tree 题解&代码
- webdriver 要用firefox的Profile
- ios NSString 与 char[] 互转--char数组
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究
- 机器学习中PCA和ICA的理解