1. 程式人生 > >Android讀取指定路徑的點陣圖(FR:徐海濤)

Android讀取指定路徑的點陣圖(FR:徐海濤)

   public Bitmap revitionImageSize(String path)
        throws IOException
    {
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path)));
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true; //設定True只解碼圖片的Bounds
BitmapFactory.decodeStream(in, null, options); in.close(); int i = 0; Bitmap bitmap = null; while (true) { if ((options.outWidth >> i <= 256) && (options.outHeight >> i <= 256)) { in = new
BufferedInputStream(new FileInputStream(new File(path))); options.inSampleSize = (int)Math.pow(2.0D, i); //表示2的i次方 options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(in, null, options); break; } i += 1
; } return bitmap; }

有些人會問 ,知道一個圖片的SD卡儲存路徑,搞一個輸入流,然後抽取資料,最後關閉流不就OK啦嗎,為啥搞得這麼複雜

其實主要原因是在:
BitmapFactory.decodeStream(Stringpath)方法返回Bitmap時,遇到大一點的圖片,經常會遇到OOM(Out OfMemoery)

這裡寫圖片描述

BitmapFactory.Options 類, 定義了以何種方式將圖片讀到記憶體

inJustDecodeBounds 如果設定為True,BitmapFactory.decodeStream就不會直接返回一個位圖,而只是返回點陣圖的寬和高,這樣就不會佔用太高的記憶體,具體的寬和高獲取如下:

options.outWidth和options.outHeight

inSampleSize 可以根據實際的寬高和期望的寬高來計算這個值,如果inSampleSize = 8,那麼圖片就變成原來的1/8

FR:海濤高軟(QQ技術交流群:386476712)