在Android程式中,只要將圖放在/res/drawable/目錄下即可以透過R.drawable.id來獲得取的圖
檔,如想從手機或記憶卡中讀取照片,即可用Android API中提供的
Bitmap(android.graphics.Bitmap)與BitmapFactory(android.graphics.BitmapFactory),就可以讀
取記憶卡或手機裡的圖檔了,利用BitmapFactory(android.graphics.BitmapFactory)將圖檔轉換成
Bitmap(android.graphics.Bitmap)物件,以下利用decodeFile()將手機裡的圖檔轉換成Bitmap物件。
一般行動裝置的記憶體(RAM)是有限的,在Android上,對每個程式能使用的記憶體也有所限
制,通常占用記憶體一個很大的元兇就是圖,而如果載入圖片是千萬畫素,往往伴隨的是
OutofMemory,這時可以利用BitmapFactory(android.graphics.BitmapFactory)裡的
inJustDecodeBounds。
依據SDK說明,If set to true, the decoder will return null (no bitmap), but the out...,如果當我
們把它設為True,那麼BitmapFactory.decodeFile(String path,options opt)他並不會回傳一個
Bitmap,他並不會decode整張圖放到記憶體裡,而是將只取出整張圖的寬與高,第二次decode才
會真正的放進記憶體內,而inSampleSize值越大解析度越小,占用memory也越小,通常值2~4就
差不多了,並可搭配option.inPurgeable=true,讓Java系統在記憶體不足時可回收部分記憶體。
-----------------------------------------------------------------------我是分隔線-----------------------------------------------------------------------------
程式碼:
File file = new File(fileName);
if (file.exists()) {
BitmapFactory.Options option = new BitmapFactory.Options();
option.inJustDecodeBounds = true;
option.inPurgeable = true;
Bitmap bm = BitmapFactory.decodeFile(fileName, option);
// -----------------------------------------------------------------------縮圖-----------------------------------------------------------------------------------
int yRatio = (int) Math.ceil(option.outHeight / 500);
int xRatio = (int) Math.ceil(option.outWidth / 500);
if (yRatio > 1 || xRatio > 1) {
if (yRatio > xRatio) {
option.inSampleSize = yRatio;
Toast.makeText(MainActivity.this,
"yRatio = " + String.valueOf(yRatio),
Toast.LENGTH_LONG).show();
} else {
option.inSampleSize = xRatio;
Toast.makeText(MainActivity.this,
"xRatio = " + String.valueOf(xRatio),
Toast.LENGTH_LONG).show();
}
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
option.inJustDecodeBounds = false;
bm = BitmapFactory.decodeFile(fileName, option);
imageview.setImageBitmap(bm);
Toast.makeText(MainActivity.this, "檔案: "+fileName, Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(MainActivity.this, "檔案不存在", Toast.LENGTH_SHORT)
.show();
}
注意:記得在AndroidManifest要打開權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
執行結果:
程式碼:https://www.dropbox.com/s/3wcu0tvxqt4406c/ImageLoader.rar?dl=0