Android讀取指定路徑的點陣圖(FR:徐海濤)
阿新 • • 發佈:2019-01-09
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)