Android实现简单图片压缩的方法

 更新时间:2016年06月28日 15:17:39   作者:zeo  
这篇文章主要介绍了Android实现简单图片压缩的方法,详细分析了Android针对图片的读取、缩放及保存等操作技巧,需要的朋友可以参考下

本文实例讲述了Android实现简单图片压缩的方法。分享给大家供大家参考,具体如下:

在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?

我们发现,Options中有个属性inJustDecodeBounds,SDK中的英文引用如下:

If set totrue, the decoder will return null (no bitmap), but the out... fields will stillbe set, allowing the caller to query the bitmap without having to allocate thememory for its pixels.

意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。

具体代码如下:

FrameLayout fr=(FrameLayout)findViewById(R.id.FrameLayout01);
BitmapFactory.Options options =new BitmapFactory.Options();
options.inJustDecodeBounds =true;
// 获取这个图片的宽和高
Bitmap bitmap =BitmapFactory.decodeFile("/sdcard/test.jpg", options); //此时返回bm为空
options.inJustDecodeBounds =false;
 //计算缩放比
int be = (int)(options.outHeight/ (float)200);
if (be <= 0)
  be = 1;
options.inSampleSize = be;
//重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦
bitmap=BitmapFactory.decodeFile("/sdcard/test.jpg",options);
int w = bitmap.getWidth();
int h = bitmap.getHeight();
System.out.println(w+"  "+h);
ImageView iv=new ImageView(this);
iv.setImageBitmap(bitmap);

这样我们就可以读取较大的图片而不会内存溢出了。如果你想把压缩后的图片保存在Sdcard上的话就很简单了:

File file=new File("/sdcard/feng.png");
try {
  FileOutputStream out=newFileOutputStream(file);
  if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){
    out.flush();
    out.close();
  }
} catch (FileNotFoundException e){
  // TODO Auto-generated catchblock
  e.printStackTrace();
} catch (IOException e) {
  // TODO Auto-generated catchblock
  e.printStackTrace();
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android数据库操作技巧总结》、《Android编程之activity操作技巧总结》、《Android文件操作技巧汇总》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》、《Android视图View技巧总结》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

相关文章

  • Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序

    Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序

    本文主要介绍在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序,这里对测试Linux 内核驱动程序做了详细介绍,并附有代码示例,有兴趣的小伙伴可以参考下
    2016-08-08
  • RxJava 1升级到RxJava 2过程中踩过的一些“坑”

    RxJava 1升级到RxJava 2过程中踩过的一些“坑”

    RxJava2相比RxJava1,它的改动还是很大的,那么下面这篇文章主要给大家总结了在RxJava 1升级到RxJava 2过程中踩过的一些“坑”,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下来要一起看看吧。
    2017-05-05
  • 简述angular自定义过滤器在页面和控制器中的使用

    简述angular自定义过滤器在页面和控制器中的使用

    这篇文章主要介绍了简述angular自定义过滤器在页面和控制器中的使用的相关资料,需要的朋友可以参考下
    2016-09-09
  • Android Scroller大揭秘

    Android Scroller大揭秘

    本篇文章主要介绍了Android Scroller的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Android通用LoadingView加载框架详解

    Android通用LoadingView加载框架详解

    这篇文章主要为大家详细介绍了Android通用LoadingView加载框架的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android GestureDetector手势滑动使用实例讲解

    Android GestureDetector手势滑动使用实例讲解

    这篇文章主要为大家详细介绍了Android GestureDetector手势滑动使用实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android视图绑定viewBinding的使用介绍

    Android视图绑定viewBinding的使用介绍

    最近这段时间在学习Kotlin,突然发现谷歌已经把kotlin-android-extensions插件废弃,目前推荐使用ViewBinding来进行替代,接下来通过本文给大家分享Android使用ViewBinding的详细步骤,感兴趣的朋友一起学习吧
    2023-01-01
  • Android8.1 通过黑名单屏蔽系统短信和来电功能

    Android8.1 通过黑名单屏蔽系统短信和来电功能

    最近小编接到一个新的需求,需要将8.1 设备的来电功能和短信功能都屏蔽掉,特殊产品就是特殊定制。接下来通过本文给大家介绍Android8.1 通过黑名单屏蔽系统短信和来电功能,需要的朋友参考下吧
    2019-05-05
  • Kotlin Job启动流程源码层深入分析

    Kotlin Job启动流程源码层深入分析

    如果要我拿现实中的一事物与Kotlin协程中的Job做一个类比,那么我会把Job比作成海洋中的冰山。自由漂浮的冰山约有90%体积沉在海水表面下,因此看着浮在水面上的形状并猜不出水下的形状
    2022-11-11
  • Flutter fluro时报错type 'String' is not a subtype of type 'Queue<Task>'

    Flutter fluro时报错type 'String' is not a subty

    这篇文章主要介绍了Flutter使用fluro时报错type 'String' is not a subtype of type 'Queue<Task>'解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-12-12

最新评论