2012-06-30 61 views
1

我已經遍尋全面瞭解我的問題的解決方案,但似乎無法弄清楚。我敢肯定它可能只有1或2條簡單的線條,希望有人能引導我走向正確的方向。將字符串轉換爲uri以位圖顯示在ImageView中

在我的應用程序中,用戶可以單擊一個按鈕打開畫廊。一旦他們選擇了一個圖像,它會在我的應用程序中的ImageView中顯示該圖像。這部分工作得很好。本來,我只是從畫廊返回一個URI,我會直接顯示與此:

imageView1.setImageURI(myUri); 

嗯,很明顯我現在遇到了可怕的「內存不足」的錯誤,如果用戶重新加載該頁面連續幾次,所以我不得不清理我的代碼來縮小圖像。我通過實現一個位圖類來完成這項工作,該類將圖像轉換爲位圖併爲我縮放。現在,我的ImageView顯示代碼如下所示:

imageView1.setImageBitmap(bitmap1); 

這部分工作正常。這是問題:

我將uri路徑轉換爲字符串,然後將其保存在SharedPreference中。這是爲了當用戶退出應用程序並稍後返回時,它們自動設置的圖像會自動顯示。我轉換的URI是這樣的:

... 
selectedImageUri = data.getData(); 
String selectedImagePath; 
selectedImagePath = getPath(selectedImageUri); 
... 

舊的方法來檢索SharedPreference字符串,將其轉換爲URI,然後顯示它是工作的罰款。 (除外出,當然內存不足錯誤)它是這樣的:

Uri myUri = Uri.parse(selectedImagePath); 
imageView1 = setImageURI(myUri); 

「selectedImagePath」顯然,我從SharedPreference檢索到的字符串。再次,這工作得很好,但如果重新加載太多次會拋出錯誤。

現在不工作的部分是當我嘗試實現新的位圖轉換,以便我可以縮放位圖而不會出現內存錯誤。這裏是代碼爲:

Uri myUri = Uri.parse(selectedImagePath) 
Bitmap bitmap = getThumbnail(myUri); 
imageView1.setImageBitmap(bitmap); 

這什麼都不顯示。原始圖像選擇顯示圖像正常,但是當我返回到此屏幕並嘗試從SharedPreference解析字符串,然後將其轉換爲位圖時,無法顯示任何內容。對於「getThumbnail」方法的代碼是直接從這篇文章採取--->

How to get Bitmap from an Uri?

這是第3個答案了。

任何人有任何想法?對不起,超長的帖子,但我寧願解釋我的問題,而不是提供足夠的信息。對不起,如果這是在別的地方回答。我一直在尋找其他問題幾個小時,並沒有找到任何解決我的問題。

謝謝。

回答

10

我想通了,所以這裏是我爲其他人有這個獨特的問題。將圖像從畫廊的選擇和它返回的意圖後,我通過這段代碼得到了該意圖的數據:

selectedImageUri = data.getData(); 

然後我通過這個從路徑:

selectedImagePath = getPath(selectedImageUri); 

哪打電話給這個「getPath」方法:

public String getPath(Uri uri) 
{ 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(idx); 
} 

然後我保存「selectedImagePath」作爲SharedPreference字符串。

稍後,要檢索該字符串並將其轉換回來以顯示圖像,我首先檢索了SharedPreference字符串並將其轉換回「selectedImagePath」。然後,我將它設置在像這樣的ImageView:

targetImage = (ImageView)findViewById(R.id.imageView1); 
targgetImage.setImageBitmap(decodeSampledBitmapFromResource(selectedImagePath, 200, 200)); 

這讓下面的方法調用:

public static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 
// Raw height and width of image 
final int height = options.outHeight; 
final int width = options.outWidth; 
int inSampleSize = 2; 

if (height > reqHeight || width > reqWidth) { 
    if (width > height) { 
     inSampleSize = Math.round((float)height/(float)reqHeight); 
    } else { 
     inSampleSize = Math.round((float)width/(float)reqWidth); 
    } 
} 
return inSampleSize; 

}

public static Bitmap decodeSampledBitmapFromResource(String resId, 
     int reqWidth, int reqHeight) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(resId, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeFile(resId, options); 
} 

這是一個很大的代碼赫克做一個相當簡單的任務,但它的工作,所以我很高興,繼續前進。希望這會幫助需要完成相同事情的其他人。

+1

我測試你的代碼,但我得到查詢結果爲空。這是爲什麼? fyi,內容不爲空。 –

+0

這個腳本的第一部分幫了很大忙。類似的答案,但沒有解釋清楚!謝謝。 – albertpeiro

相關問題