close

     在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

 

gn00254192 / Xuite日誌 / 回應(0) / 引用(0)
[Android]AlertD...|日誌首頁|[Android]製作神魔之塔...上一篇[Android]AlertDialog(加入按鈕、加入List以及塞入一個Layout)...下一篇[Android]製作神魔之塔進入畫面...
回應