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 ...
随机推荐
- C语言如何在两个文件中访问同一个全局变量
方法一: 不使用头文件. 1.c 中 int var; 2.c 中 extern int var; 方法二: 使用头文件. 1.c 中 int var; 不必添加#include "1.h& ...
- Bootstarp-table入门
介绍 介绍什么的,大家自己去下面的网站看 Bootstrap中文网:http://www.bootcss.com/ Bootstrap Table Demo:http://issues. ...
- android studio的快捷键设置的和eclispe一样
最近安装了android studio,但是习惯了使用eclispe的快捷键,所以我也把android studio的快捷键设置的和eclipse一样. 具体如下: 1.快捷键 Android Stu ...
- PAM30 模拟登陆 投票
Python真的是让人爱不释手啊,一直以来都不知道如何自动投票,然而今天有幸看到了PAM30,下面谈一谈我一个小案例吧. 准备 PAM30下载地址 编码前注意 由于一开始没有什么概念,还以为是个第三方 ...
- Android View框架总结(五)View布局流程之Layout
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52216195 View树的Layout流程 View的Layout时序图 View布局 ...
- JVM的GC(概念与深入)
深入浅出了解什么是GC: http://my.oschina.net/xianggao/blog/86985 GC策略详解: http://blog.csdn.net/winniepu/article ...
- linux下可执行文件的库们
在Linux下有一些命令可以让我们知道可执行文件的很多信息. 记录如下: ldd : print shared library dependencies nm: list symbols from o ...
- Java异步通信
服务器端: import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; impo ...
- python上下文管理器ContextLib及with语句
http://blog.csdn.net/pipisorry/article/details/50444736 with语句 with语句是从 Python 2.5 开始引入的一种与异常处理相关的功能 ...
- JSP实现界面的自动跳转的几种方式
下面来谈一谈在jsp中实现的几种界面自动跳转的方法. 使用JavaScript脚本 <html> <script language=javascript> function o ...