首页 > 代码库 > decodeFileDescriptor()与bimap比decodeFile()比较

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 here17             }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);

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

 

decodeFileDescriptor()与bimap比decodeFile()比较