Android应用开发之(图片处理技巧一)

转载 2012年03月24日 20:25:58

Android应用开发中我们会经常用到图片处理的技术,今天给大家分享些获取固定宽度图片的技巧

 

移动开发中,内存资源很宝贵,而且对加载图片内存空间也有限制;所以我们会在加载图片对图片进行相应的处理,有时为了提高响应速度,增强用户体验,我们在加载大图片时会先加载图片的缩略图、如后加载原图,所以我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的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,必须做判断。具体代码如下:

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=new FileOutputStream(file);           

 if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){               

 out.flush();               

 out.close();           

 }        

} catch (FileNotFoundException e) {            

e.printStackTrace();        

} catch (IOException e) {            

e.printStackTrace();       

 }

ok,这样就把图片保存在/sdcard/feng.png这个文件里面了,呵呵。

相关文章推荐

Android Fresco图片处理库用法API英文原文文档1(Facebook开源Android图片库)

目录(?)[-] Fresco RequirementsUsing Fresco in your applicationBuilding Fresco from sourceJoin th...

《Android源码设计模式解析与实战》读书笔记(五)

第五章、工厂方法模式1.定义定义一个用于创建对象的接口,让子类决定实例化那个类。2.使用场景在任何需生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无...

Android应用开发之(你必须知道的“避免内存溢出图片处理方案”)

今天给大家分享一些图片处理常用技术方案,Android应用开发的朋友必须要了解呀! 众所周知在Android应用开发中在对图片处理时,稍有不慎就会出现以下异常: java.lang.Out...

Android应用开发技巧之更方便的使用Sqlite

做应用的大多离不开数据库的支持,但是就是这么常用的对象,你有没有想过让他更方便的使用呢?什么是更方便,我的定义就是不用在每次需要用它的时候对SQL语句做过多的关心,我们应该更多的关心每一个字段的含义;...

Android应用开发的几个小技巧

Android应用开发的几个小技巧        本人在开发Android版手机离线地图应用程序中的几个小经验,拿出来和大家分享。 1、  Android的Adb shell下常用的命令ls : 列出...
  • chchzh
  • chchzh
  • 2011年04月25日 12:02
  • 1479

Android应用开发之(利用好图片缓存)

Android Developer: 在用户界面(UI)加载一张图片时很简单,然而,如果你需要加载多张较大的图像,事情就会变得更加复杂,。在许多情况下(如与像的ListView GridView...

Android应用开发中三种常见的图片压缩方法

Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法、比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩)。一、质量压缩法private Bitmap compr...

Android应用开发自定义图片剪辑头像设置

很早就有有看到有朋友在讨论QQ头像的裁剪上传是怎么实现的,吼吼,之前小马也没做过,好奇之下学习下,发现以前项目中有类型的功能,结合官方文档里面的解释,就更好玩了,急急忙忙写51里的,今天听变3主题曲,...

Android应用开发之图片(Bitmap)压缩(二)---------质量压缩

可以写代码测试一下,在测试之前说说bitmap的占用内存的计算方法,就是像素*像素占用的字节,这里有一篇博客本人觉得写的挺好http://www.2cto.com/kf/201409/338241.h...
  • ls703
  • ls703
  • 2014年10月30日 11:20
  • 4162

Android应用开发之图片(Bitmap)压缩(三)---------采样率压缩

采样率压缩:
  • ls703
  • ls703
  • 2014年10月31日 18:25
  • 1989
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android应用开发之(图片处理技巧一)
举报原因:
原因补充:

(最多只允许输入30个字)