2011-04-08 48 views
0

我需要從SD卡加載大量大圖像(500個.png文件)到我的應用程序。我是否總是必須將圖像轉換爲位圖並創建位圖文件?我不想調整堆大小。 是否有另一種方式從SD卡讀取圖像?Android從外部存儲器加載大圖像

回答

0

應用程序中圖像的內部表示是位和字節的集合 - 不是任何特定格式(png,bmp等)的圖像。

當圖像由BitmapFactory加載時,圖像被轉換爲​​此內部表示。

它通常是不加載在一旦所有的位圖是一個好主意,你會很快耗盡內存...

+0

非常感謝的答案。你是絕對正確的,但由於要求,我應該一次加載所有圖像。 – Maria 2011-04-08 12:08:48

1

如果你在一個視圖中顯示它們,那麼你必須將其裝入內存完整。

你沒有提到你的圖片會有多大,但是我們在我們的照片庫中做的是保留這些位圖的SoftReference s列表,以便垃圾收集器可以在它們不可見的(即當顯示它們的視圖被丟棄時 - 確保實際發生這種情況,例如通過使用AdapterView)。結合這些與這些位圖的延遲加載,你應該很好。

+0

其實他們不是那麼大。也許總共5 MB。但我有一個viewflipper與圖像(和其他一些小部件)。所以我不能使用Gallery。 – Maria 2011-04-08 12:13:45

+0

不確定'ViewFlipper'如何在內部工作,但如果它沒有保留對圖像'Drawable'的強引用,它就是「翻轉」,那麼它應該沒問題。 – Matthias 2011-04-08 13:31:10

0

如果圖片的尺寸非常大,您必須在加載到ImageView之前調整它們的大小。否則,即使一張圖片也容易引起內存不足問題。我不知道你想同時顯示多少張圖片,以及它們有多大。但我建議你在顯示它們之前調整它們的大小。

要調整圖像,並顯示它,您可以使用此代碼:

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
    bitmapOptions.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(fileInputStream, null, bitmapOptions); 

    //reduce the image size 
    int imageWidth = bitmapOptions.outWidth; 
    int imageHeight = bitmapOptions.outHeight; 
    int scale = 1; 
    while (imageWidth/scale >= screenWidth && imageHeight/scale >= screenHeight) { 
     imageWidth = imageWidth/2; 
     imageHeight = imageHeight/2; 
     scale = scale * 2; 
    } 

    //decode the image with necessary size 
    fileInputStream = new FileInputStream(cacheFile); 
    bitmapOptions.inSampleSize = scale; 
    bitmapOptions.inJustDecodeBounds = false; 
    imageBitmap = BitmapFactory.decodeStream(fileInputStream, null, bitmapOptions); 
    ImageView imageView = (ImageView)this.findViewById(R.id.preview); 
    imageView.setImageBitmap(imageBitmap); 

在我的Android項目,我用這一段代碼來調整我的高清壁紙進行審查。

Android Save And Load Downloading File Locally