Android中的图片压缩
1、android中计算图片占用堆内存的kB大小跟图片本身的kB大小无关,而是根据图片的尺寸来计算的。
比如一张 480*320大小的图片占用的堆内存大小为:
480*320*4/1024=600kB 之所以要乘以4,是因为在android中使用的ARGB图片,图片一个像素占用四个字节。
2、手机出厂时 堆内存(Heap)是固定的,所以为了不造成OOM,我们就需要生成bitmap时对图片进行压缩处理。
实际使用中我们压缩图片的标准是手机屏幕大小作为参照的,这个主要是因为,即便是图片尺寸跟屏幕尺寸相同,换算出来所占的内存大小也要远小于手机堆存。
为了讲解方便,我们就以 480*320大小的手机为例,图片压缩为同手机屏幕同尺寸时,所占的大小为 600kb,也就是0.6M,而480*320的手机的出厂heap一般是16M,这个数字根据每个厂商有所差异。
3、压缩方式:通过bitmap的options
首先大家要知道,当图片太大造成加载时,报OOM异常是在哪个地方报的?
打印测试知道是在:Bitmap bitmap = BitmapFactory.decodeFile(url)这行就报错。所以我们的处理如下:
/**
* 压缩图片
*
* @param photoPath
*/
public static Bitmap compressImage(Activity act, String photoPath) {
int screenWidth = act.getWindowManager().getDefaultDisplay().getWidth();
int screenHeight = act.getWindowManager().getDefaultDisplay().getHeight();
LogUtils.logInfoStar("screenWidth为" + screenWidth + "------screenHeight" + screenHeight);
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;//设置为true的目的,拿到图片的一些附属信息
BitmapFactory.decodeFile(photoPath, opts);
int imgWidth = opts.outWidth;
int imgHeight = opts.outHeight;
//获取屏幕尺寸的方式二:支持13以上版本,就是使用point存储宽高,然后再取出来。
// Point point=new Point();
// getWindowManager().getDefaultDisplay().getSize(point);
// screenWidth=point.x; 8 // screenHeight=point.y;
LogUtils.logInfoStar("图片原大小" + "imgWidth为:" + imgWidth + "imgHeight" + imgHeight);
//按屏幕大小获取的压缩比例,加入判断,只有图片尺寸大于屏幕尺寸时才压缩
if (imgHeight > screenHeight || imgWidth > screenWidth) {
int sizeByScreenSize = imgWidth / screenWidth > imgHeight / screenHeight ? imgWidth / screenWidth : imgHeight / screenHeight;
//再在此基础把压缩比例增大10倍
opts.inSampleSize = sizeByScreenSize * 10;
LogUtils.logInfoStar("inSampleSize" + sizeByScreenSize);
} else {
opts.inSampleSize = 1;
}
opts.inJustDecodeBounds = false;
Bitmap mImage = BitmapFactory.decodeFile(photoPath, opts);
return mImage;
}
总结:
##缩放加载大图片
1.获取你想显示的图片应该有的大小,如果是全屏,就获取屏幕大小
2.获取图片的原始大小,不将图片真正加载到内存,只拿到图片的附属信息
Options opts = new Options();
设置为true,不加在内存,只拿信息
opts.inJustDecodeBounds = true;
3.对图片做压缩处理,压缩的前提是图片的大小大于你要显示的区域大小
按照宽或者高的比例进行计算,选择比例大的那个进行压缩
压缩的比例值最后复制给
opts.inSampleSize = scale;
4.比例设置完之后,这时候才是真正的去加载图片到内存当中
opts.inJustDecodeBounds = false;
5.最后一部才是加载图片
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg", opts);
我们做这么多操作的最终目的其实就是为了要opts.inSampleSize = scale这个值。
Android中的图片压缩的更多相关文章
- Android笔记(七十五) Android中的图片压缩
这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...
- Android 中对于图片的内存优化方法
Android 中对于图片的内存优化方法,需要的朋友可以参考一下 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...
- Android 简单介绍图片压缩和图片内存缓存
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工, ...
- Android中获取图片的宽和高
在Android中,我们想获取图片的宽和高应该怎么办?一.正常加载图片的方法下获取宽和高 举一个简单的例子:创建一个图片的副本 //加载原图 Bitmap bmSrc = BitmapFactory. ...
- Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内存溢出的Bug
由于android获取图片过大是会出现内存溢出的Bug 07-02 05:10:13.792: E/AndroidRuntime(6016): java.lang.OutOfMemoryError 解 ...
- WEB前端开发中的图片压缩
web前端开发中,图片的重要性不言而喻,而由于一些图片的大小加上现在国内的网速不给力等种种原因,我们非常有必要对网站使用的图片进行压缩,压缩图片必然会带来图片质量的损失,我们要尽可能的在质量降低很小的 ...
- 在Android中实现图片的裁剪
本实例的功能是将用户选择的图片裁剪后放入ImagView,布局文件是个Button和ImageView.为了图片的正常显示,我们在裁剪后先将裁剪好的图片先存放到SD卡中,这样就能在以后开启应用 ...
- Android中9-Patch图片之理解
在android中,不仅可以将扩展名为.png,.jpg,.gif的普通图片作为图片资源,而且可以将扩展名为.9.png的9-Patch图片作为图片资源.扩展名为.png,.jpg,.gif的普通图片 ...
- Android学习之图片压缩,压缩程度高且失真度小
曾经在做手机上传图片的时候.直接获取相机拍摄的原图上传,原图大小一般1~2M.因此上传一张都比較浪费资源,有些场景还须要图片多张上传,所以近期查看了好多前辈写的关于图片处理的资料.然后试着改了一个图片 ...
随机推荐
- javascript学习之位置获取
一.获取浏览器的大小和位置 具体可以参见博客:http://www.cnblogs.com/bobodeboke/p/4653920.html 二.获取元素的大小和位置 方法一.利用offsetXXX ...
- CNContact对通讯录的基本使用(增删改查)
/** * 注意:iOS9才有能使用 * 首先在工程里导入ContactsUI.framework和Contacts.framework两个框架 * * * 源代码的链接地址 * 链接: http:/ ...
- java.net.ConnectException: Connection refused: connect
在dos命令里输入netstat 查看下serverSocket所监听的端口有没有存在.
- ios 获取崩溃日志
虽然有了try catch异常捕获,但是还是存在崩溃异常无法捕获到的.我可以通过下面的方式来获取崩溃日志: - (BOOL)application:(UIApplication *)applicati ...
- SpinLock 实现
/* Example: SpinLock Description: SpinLock is the lock implementation using AtomicInteger as a primi ...
- org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map
mybatis 出现这个错误是 参数类型写错了.parameterType 写成了parameterMap
- php导入导出
首先:下载好PHPExcel类库文件 视图层: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- 夺命雷公狗ThinkPHP项目之----企业网站16之文章批量删除的完成
我们在做一个网站时候经常会遇到批量删除这个选项,其实也很简单,我们之需要用用jq实现出来效果然后通过表单post过去后端即可实现: 我们做这个功能前必须要先引入jq,我的jq版本是1.8.3,方法如下 ...
- thinphp讲解(三)——空操作、空控制器、跨控制器、命名空间
一.“空操作”本质意思:一个对象(控制器)调用本身不存在的操作方法 一般网站处于安全考虑不给用户提示任何错误信息 在tp里面控制器controller.class.php里有个_call()方法 所以 ...
- 关于archlinux下的ralink5370网卡
驱动此网卡要使用 rt2800usb,rt2800lib 这两个模块 顺便说一下对模块进行操作的命令: rmmod 模块名 //为移除模块 insmod 模块所在路径 //为添加模块 查看网卡是否能被 ...