Android中处理大图片时图片压缩
1、BitmapFactory.Options中的属性
在进行图片压缩时,是通过设置BitmapFactory.Options的一些值来改变图片的属性的,下面我们来看看BitmapFactory.Options中常用的属性意思:
- options.inPreferredConfig - 设置Bitmap的偏好配置,值有Bitmap.Config.ARGB_8888,Bitmap.Config.ARGB_4444,Bitmap.Config.ARGB_8888,Bitmap.Config.RGB_565。默认为ARGB_8888,顾名思义,这是设置Bitmap的显示质量的。
- options.outHeight - 得到该Bitmap的高。
- options.outWidth - 得到该Bitmap的宽。
- options.outMimeType - 得到该Bitmap的MIME值。
- options.inSampleSize - 压缩比例,如果options.inSampleSize = 4;那么压缩后的图片的宽和高都为原来图片的1/4,压缩后的图片的像素为原来图片的1/16。
- options.inJustDecodeBounds - 官方文档上是这样介绍的:
- If set to true, the decoder will return null (no bitmap), but
the out... fields will still be set, allowing the caller to query
the bitmap without having to allocate the memory for its pixels. - 意思就是:如果设置为true,那么使用BitmapFactory.decodeStream(InputStream is, Rect outPadding,
Options opts)或BitmapFactory.decodeXXX(....,Options opts)方法并不会真的返回一个Bitmap对象,而是返回null,虽然返回null,但是我们却可以通过options来获得该Bitmap的一些值,如它的宽、高、MimeType等值。这样就不必为Bitmap对象分配内存空间也可以获得它的Width和Height,从而节约内存。所以这个属性对我们压缩图片前进行检查大有帮助。常用的技巧就是为了避免图片过大而导致OOM,所以在我们加载图片之前就通过设置它为true,获取到图片的宽、高等值,然后进行一些判断检查等,决定图片是否压缩。我们来看看加载一张405x579图片的例子: - final BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- Bitmap bitmap = BitmapFactory.decodeResource(getResource(), R.mipmap.two, options);
- Log.v("zxy","bitmap="+bitmap);
- int height = options.outHeight;
- int width = options.outWidth;
- String mimeType = options.outMimeType;
- Log.v("zxy","mimeType="+mimeType+",height="+height+",width="+width);
上述代码输出的是:
可以知道确实是返回null了,而且还获得了该Bitmap的宽高等值。
- If set to true, the decoder will return null (no bitmap), but
2、通过实例来看看怎么压缩图片
- public class MainActivity extends ActionBarActivity {
- private ImageView mImageView, mResizeImageView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mImageView = (ImageView) findViewById(R.id.imageView);
- mResizeImageView = (ImageView) findViewById(R.id.resize_imageView);
- mImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.mipmap.two));
- Bitmap bitmap = compressBitmap(getResources(), R.mipmap.two, 100, 100);
- Log.v("zxy", "compressBitmap,width=" + bitmap.getWidth() + ",height=" + bitmap.getHeight());
- mResizeImageView.setImageBitmap(bitmap);
- }
- /**
- * @param res Resource
- * @param resId 资源id
- * @param targetWidth 目标图片的宽,单位px
- * @param targetHeight 目标图片的高,单位px
- * @return 返回压缩后的图片的Bitmap
- */
- public Bitmap compressBitmap(Resources res, int resId, int targetWidth, int targetHeight) {
- final BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;//设为true,节约内存
- BitmapFactory.decodeResource(res, resId, options);//返回null
- int height = options.outHeight;//得到源图片height,单位px
- int width = options.outWidth;//得到源图片的width,单位px
- //计算inSampleSize
- options.inSampleSize = calculateInSampleSize(width,height,targetWidth,targetHeight);
- options.inJustDecodeBounds = false;//设为false,可以返回Bitmap
- return BitmapFactory.decodeResource(res,resId,options);
- }
- /**
- * 计算压缩比例
- * @param width 源图片的宽
- * @param height 源图片的高
- * @param targetWidth 目标图片的宽
- * @param targetHeight 目标图片的高
- * @return inSampleSize 压缩比例
- */
- public int calculateInSampleSize(int width,int height, int targetWidth, int targetHeight) {
- int inSampleSize = 1;
- if (height > targetHeight || width > targetWidth) {
- //计算图片实际的宽高和目标图片宽高的比率
- final int heightRate = Math.round((float) height / (float) targetHeight);
- final int widthRate = Math.round((float) width / (float) targetWidth);
- //选取最小的比率作为inSampleSize
- inSampleSize = heightRate < widthRate ? heightRate : widthRate;
- }
- return inSampleSize;
- }
- }
我们通过看Log可以知道压缩后图片的宽高:
我们再看看效果图:
Android中处理大图片时图片压缩的更多相关文章
- Android中 在显示ImageView时图片上面和下面都出现一段空白区间的解决办法
开始的时候是在ScrollView中显示ImageView的时候出现这样的问题,以为是要对ScrollView进行设置的,后来发现单独显示一个ImageView的时候也会出现这样的问题,由此才知道是应 ...
- Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...
- Android ListView分页加载时图片显示问题
场景:Android ListView需要分页加载,每个item中会有图片,图片又是从网络下载的. 问题:在滑动加载下一页时,上一页的图片明明已经下载完成了,但是无法显示出来. Bug重现: 1,加载 ...
- Android中的Glide加载图片
注意:在Android Studio的项目的build.gradle中添加: compile 'com.github.bumptech.glide:glide:3.6.1' 然后同步一下 目录: 使用 ...
- CSS3实现鼠标经过图片时图片放大
在鼠标经过图片时,图片被放大,而且还有个过渡的效果.... <!DOCTYPE html> <html> <head> <link href="cs ...
- wpf RenderTargetBitmap保存控件为图片时图片尺寸不对的问题
使用RenderTargetBitmap渲染图片时,必须在需要渲染的控件外层包含一个border控件,不然渲染的图片返回就会出现问题. 如下: <Grid> <Grid.RowDef ...
- Android中实现照片滑动时左右进出的动画的xml代码
场景 Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...
- 百度ueditor中复制word图文时图片转存任然保持灰色不可用
官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...
随机推荐
- Gazebo機器人仿真學習探索筆記(六)工具和实用程序
Gazebo附带了许多工具和实用程序. 这些教程说明了这些可用的工具,以及如何使用它们. 主要有: 1 记录和播放 2 日志过滤 3 应用力/扭矩 4 HDF5数据集 官网介绍通俗具体,非常容易,请参 ...
- Windows运行GitStats
Windows运行GitStats(金庆的专栏)GitStats - git history statistics generatorhttp://gitstats.sourceforge.net/G ...
- main函数之后的调用
main函数代表进程的主线程.程序开始执行时,系统为程序创建一个进程,main函数其实并不是首先被调用的函数,而是操作系统调用了C/C++运行期启动函数,该函数负责对C/C++ 运行期库进行初始化.它 ...
- FORM内置系统变量
常用 和输入焦点有关: SYSTEM.CURSOR_ITEM:返回系统当前正在操作的项名. SYSTEM.CURSOR_RECORD:返回系统当前正在操作的记录行号. SYSTEM.CURSOR_BL ...
- 在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法!
在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法! 其实像按键的监听,我相信很多人都很熟练了,我肯定也不会说这些基础的东西,所以,前期,还是 ...
- Android之自定义AlertDialog和PopupWindow实现(仿微信Dialog)
我们知道,在很多时候,我们都不用Android内置的一些控件,而是自己自定义一些自己想要的控件,这样显得界面更美观. 今天主要是讲自定义AlertDialog和popupWindow的使用,在很多需求 ...
- API创建员工支付方式
DECLARE ln_method_id PAY_PERSONAL_PAYMENT_METHODS_F.PERSONAL_PAYMENT_METHOD_ID%TYPE; ln_ext_acc_id P ...
- shell入门之流程控制语句
1.case 脚本: #!/bin/bash #a test about case case $1 in "lenve") echo "input lenve" ...
- Android 震动马达系统
Android之 看"马达"如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --> ...
- iOS 图片裁剪与修改
最近做的项目中需要上传头像,发表内容的时候也要涉及到图片上传,我直接用的原图上传,但是由于公司网络差,原图太大,老是加载好久好久,所以需要把原图裁剪或者修改分辨率之后再上传,找了好久,做了很多尝试才解 ...