Android图片缩放方法
安卓开发中应用到图片的处理时候,我们通常会怎么缩放操作呢,来看下面的两种做法:
方法1:按固定比例进行缩放
在开发一些软件,如新闻客户端,很多时候要显示图片的缩略图,由于手机屏幕限制,一般情况下,我们取图片的缩略图,取缩略图的方法我们可以使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。但是,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片取出来的缩略图高度都为200px,同时要保证图片不失真,那我们该怎么办?总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,一张100K的图片,加载完所占用的内存何止是100K。
经过阅读文档发现,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那么将不返回实际的bitmap对象,不给其分配内存空间但是可以得到一些解码边界信息即图片大小等信息。因此我们可以通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),就可以取图片了,这里要注意的是,inSampleSize 可能等于0,必须做判断。也就是说先将Options的属性inJustDecodeBounds设为true,先获取图片的基本大小信息数据(信息没有保存在bitmap里面,而是保存在options里面),通过options.outHeight和 options. outWidth获取的大小信息以及自己想要到得图片大小计算出来缩放比例inSampleSize,然后紧接着将inJustDecodeBounds设为false,就可以根据已经得到的缩放比例得到自己想要的图片缩放图了。
实现代码如下:
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- // 记得把assets目录下的图片拷贝到SD卡中
- // 由于设置inJustDecodeBounds为true,因此执行下面代码后bitmap为空
- mBitmap = BitmapFactory.decodeFile("/sdcard/image.jpg", options);
- // 计算缩放比例,由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
- int scale = (int) (options.outHeight / (float) 200);
- // 因为结果为int型,如果相除后值为0.n,则最终结果将是0
- if (scale <= 0)
- {
- scale = 1;
- }
- System.out.println("Scale=" + scale);
- options.inSampleSize = scale;
- options.inJustDecodeBounds = false;
- // 重新读入图片,注意此时已经把options.inJustDecodeBounds设回false
- mBitmap = BitmapFactory.decodeFile("/sdcard/image.jpg", options);
- int width = mBitmap.getWidth();
- int height = mBitmap.getHeight();
- System.out.println(width + " " + height);
- ImageView image = (ImageView) findViewById(R.id.image);
- image.setImageBitmap(mBitmap);
- 这样我们就可以读取较大的图片而不会出现内存溢出问题了。
- 如果你想把压缩后的图片保存在sdcard上的话,通过如下代码就可以了:
- File file = new File("/sdcard/ruoshui.png");
- try
- {
- //记得添加sdcard读写权限
- FileOutputStream out = new FileOutputStream(file);
- if (mBitmap.compress(Bitmap.CompressFormat.PNG, 100, out))
- {
- out.flush();
- out.close();
- Toast.makeText(MainActivity.this, "保存成功!", Toast.LENGTH_LONG).show();
- }
- }catch (Exception e)
- {
- e.printStackTrace();
- Toast.makeText(MainActivity.this, "保存失败!", Toast.LENGTH_LONG).show();
- }
方法2:按长宽各自比例进行缩放
上面的方法缩放保存是按长宽比例的,我们当然也可以按固定大小进行缩放:
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = false;
- // 记得把assets目录下的图片拷贝到SD卡中
- // 由于设置inJustDecodeBounds为true,因此执行下面代码后bitmap为空
- mBitmap = BitmapFactory.decodeFile("/sdcard/image.jpg", options);
- int bmpWidth = mBitmap.getWidth();
- int bmpHeight = mBitmap.getHeight();
- // 缩放图片的尺寸
- float scaleWidth = (float) sWidth / bmpWidth; // 按固定大小缩放 sWidth 写多大就多大
- float scaleHeight = (float) sHeight / bmpHeight; //
- Matrix matrix = new Matrix();
- matrix.postScale(scaleWidth, scaleHeight);// 产生缩放后的Bitmap对象
- Bitmap resizeBitmap = Bitmap.createBitmap(mBitmap, 0, 0, bmpWidth, bmpHeight, matrix, false);
- mBitmap.recycle();
- ImageView image = (ImageView) findViewById(R.id.image);
- image.setImageBitmap(resizeBitmap);
在用imageView. setBackgroundDrawable的时候有的图片会失真,事实上,如果不用上面方法进行图片的缩放,仅设置GridView或者ListView里面的LayoutParams也可以达到图片相应的图片大小,但是setBackgroundDrawable有个缺陷,会拉伸图片,解决方法是用imageView.setImageDrawable就可以了,实现图片等比例缩放
Android图片缩放方法的更多相关文章
- Android 简单的图片缩放方法
很简单的一个图片缩放方法,注意要比例设置正确否则可能会内存溢出 相关问题 java.lang.IllegalArgumentException: bitmap size exceeds 32bits ...
- android图片压缩方法
android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = ...
- android图片处理方法
Java代码 //压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ...
- Android图片压缩方法总结
本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 第一:质量压缩方法: ? 1 2 3 ...
- android图片处理方法(不断收集中)
//压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...
- Android 图片处理方法
//压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...
- android图片处理方法(转)
//压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...
- android图片缩放平移
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" ...
- Android 图片缩放
以下演示将一个ImageView的高度设置为两倍: 布局文件main.xml <?xml version="1.0" encoding="utf-8"?& ...
随机推荐
- 用js进行日期的加减
如题,开始查了查js的使用文档,但没发现可以直接用的函数,于是就想自己写函数来着,这就要涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断,虽然不复杂但我想js应该不会这么低级,于是查了下 ...
- [转]network-manager与interfaces冲突
[转]network-manager与interfaces冲突 http://blog.sina.com.cn/s/blog_48a45b9501010681.html 网络配置的两种方式 ...
- 以Lockbits的方式访问bitmap
转载自:http://www.cnblogs.com/xiashengwang/p/4225848.html 2015-01-15 11:38 by xiashengwang, 585 阅读, 0 评 ...
- Travis-CI的初步了解和测试程序的进一步编写
一. Travis-CI部分 最近基本都在研究Travis-CI的使用.CI是continue integration(持续集成)的缩写,Travis应该是给我们提供免费服务器的组织.下面介绍一下其使 ...
- java数组元素的输出
java数组元素的输出 利用Arrays.toString(数组名即可) String[] name = {"Tom", "John", "Nike& ...
- 用sql语句生成 数据字典
SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case when a.colorder=1 then isnull(f.v ...
- jQuery Dialog弹出层对话框插件
Dialog.js的相关注释已经添加,可以按照注释,进行相关样式的修改,适用于自定义的各个系统! dialog.js /** * jQuery的Dialog插件. * * @param object ...
- 【BZOJ】【3282】Tree
LCT 喜闻乐见的Link-Cut-Tree…… srO zyf http://www.cnblogs.com/zyfzyf/p/4149109.html 目测我是第222个?………………不要在意这些 ...
- 一个perfect 的解决 阴影拉伸的方法 shadow map strech
因为在场景中做了,有的物体产生阴影比如人物,有的物体不产生阴影比如地面,这样在地面凹下去的地方,悬崖,池塘边,就会有阴影的拉伸. 实际上, 没办法上传图片.... L是光源 A 点(人物身上)产生阴影 ...
- 图片放大镜插件 Cloud Zoom v3.1
Cloud Zoom是一个图像放大jQuery插件,效果堪比Magic Zoom.相对于流行jQZoom插件,Cloud Zoom体积小,有更多的功能和更强大的跨浏览器兼容性. 猛击这里查看演示DEM ...