decodeFileDescriptor()与bimap比decodeFile()比较

要点:
1、用decodeFileDescriptor()来生成bimap比decodeFile()省内存,将

Bitmap bmp = BitmapFactory.decodeFile(imageFile, opts);
imageView.setImageBitmap(bmp);

替换为

1 FileInputStream is = = new FileInputStream(path);
2 bmp = BitmapFactory.decodeFileDescriptor(is.getFD(), null, opts);

原因:
查看BitmapFactory的源码,对比一下两者的实现,可以发现decodeFile()最终是以流的方式生成bitmap

decodeFile源码:

 1 public static Bitmap decodeFile(String pathName, Options opts) {
 2     Bitmap bm = null;
 3     InputStream stream = null;
 4     try {
 5         stream = new FileInputStream(pathName);
 6         bm = decodeStream(stream, null, opts);
 7     } catch (Exception e) {
 8         /*  do nothing.
 9             If the exception happened on open, bm will be null.
10         */
11     } finally {
12         if (stream != null) {
13             try {
14                 stream.close();
15             } catch (IOException e) {
16                 // do nothing here
17             }
18         }
19     }
20     return bm;
21 }

decodeFileDescriptor的源码,可以找到native本地方法decodeFileDescriptor,通过底层生成bitmap

decodeFileDescriptor源码:

 1 public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
 2        if (nativeIsSeekable(fd)) {
 3            Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
 4            if (bm == null && opts != null && opts.inBitmap != null) {
 5                throw new IllegalArgumentException("Problem decoding into existing bitmap");
 6            }
 7            return finishDecode(bm, outPadding, opts);
 8        } else {
 9            FileInputStream fis = new FileInputStream(fd);
10            try {
11                return decodeStream(fis, outPadding, opts);
12            } finally {
13                try {
14                    fis.close();
15                } catch (Throwable t) {/* ignore */}
16            }
17        }
18    }
19
20 private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd,Rect padding, Options opts);

具体的牵扯到底层虚拟机,目前我也给不了合理解释,各位朋友有好的解释留言

时间: 2024-11-01 03:47:56

decodeFileDescriptor()与bimap比decodeFile()比较的相关文章

比较用decodeFileDescriptor和decodeFile的区别

从本地中读取图片,可以用decodeFileDescriptor和decodeFile,至于哪一种方式的耗内存情况作了一次简单对比,可能一次选取6张图片数量过少,貌似区别不大,decodeFileDescriptor能节省1.6mb左右: 1.decodeFileDescriptor的读取6张图片(中间包含压缩.读取.转Base64) 2.decodeFile的读取6张图片(中间包含压缩.读取.转Base64) public static Bitmap decodeSampledBitmapFr

Android加载手机磁盘上的资源---decodeFile方法的使用

一般在写Android程序时,通常会将图片资源放在/res/drawable/文件夹下,读取时,通过R.drawable.imageId即可读取图片内容,但用户在使用时,一般会想要读取存放在存储卡上的资源,这时候上面的方法将不起作用,这时候,就需要使用Bitmap和BitmapFactory对象,来加载手机磁盘上的资源了. 首先在布局文件里放一个ImageView,用户放置图片,图片存放的路径为/data/data/demo.jpg,在程序中首先获取ImageView,代码如下: ImageVi

Guava包学习---Bimap

Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key->value,value->key,也就是你可以通过key定位value,也可以用value定位key. 这个场景在日常开发中还是经常碰到的. 其实,Bimap相对比较简单,它是一个接口,扩展了Map接口,里面也是<K,V>格式,只不过它不允许有重复的V,这一点很重要,当你尝试往里面put一个重复的V的是会有报错信息提示.没有重复的V也就保证了你把这个map倒置的时候从V定位K也是可以唯一定位到的,我们可以看

Guava学习笔记: BiMap

Guava学习笔记: BiMap 我们知道Map是一种键值对映射,这个映射是键到值的映射,而BiMap首先也是一种Map,他的特别之处在于,既提供键到值的映射,也提供值到键的映射,所以它是双向Map. 想象这么一个场景,我们需要做一个星期几的中英文表示的相互映射,例如Monday对应的中文表示是星期一,同样星期一对应的英文表示是Monday.这是一个绝好的使用BiMap的场景. package cn.outofmemory.guava.collection; import com.google.

Guava学习笔记:Guava新增集合类型-Bimap

BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构. 通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是如果出现下面一种场景的情况,我们就需要额外编写一些代码了.首先来看下面一种表示标识序号和文件名的map结构.     @Test     public void logMapTest(){         Map<Integer,String> logfileMap = Maps.newHashMap();         log

Guava bimap

A bimap (or "bidirectional map") is a map that preserves the uniqueness ofits values as well as that of its keys. This constraint enables bimaps tosupport an "inverse view", which is another bimap containing the same entriesas this bim

强大的Guava中的新集合类型: Multiset, Multimap, BiMap, Table, ClassToInstanceMap, RangeSet, RangeMap等

一 Multiset /** * 新类型集合: Multiset: Multiset就是可以保存多个相同的对象,并且无序 * 占据了List和Set之间的一个灰色地带 * 其他实现: TreeMultiset LinkedHashMultiset * ConcurrentHashMultiset * ImmutableMultiset */ @Test public void newList(){ HashMultiset<Integer> multiset = HashMultiset.cr

Android异步加载全解析之Bitmap

Android异步加载全解析之Bitmap 在这篇文章中,我们分析了Android在对大图处理时的一些策略--Android异步加载全解析之大图处理  戳我戳我 那么在这篇中,我们来对图像--Bitmap进行一个更加细致的分析,掌握Bitmap的点点滴滴. 引入 Bitmap这玩意儿号称Android App头号杀手,特别是3.0之前的版本,简直就是皇帝般的存在,碰不得.摔不得.虽然后面的版本Android对Bitmap的管理也进行了一系列的优化,但是它依然是非常难处理的一个东西.在Androi

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 微信 下载地址 : 微信上传图片源码 很多网友不知道怎么获取图片路径,这里贴出来: String path = Bimp.tempSelectBitmap.get(position).getImagePath(); //部分代码如下 [java] view plain copy package co