2016-07-26 94 views
0

我下載的位圖是這樣的:加載位圖有效地從內部存儲,而不是資源的

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
... 
InputStream input = connection.getInputStream(); 
Bitmap myBitmap = BitmapFactory.decodeStream(input); 

並將其保存到內部存儲這樣的:

fos = new FileOutputStream(filePath); 
image.compress(Bitmap.CompressFormat.JPEG, 90, fos); 

但研究google page about bitmaps之後,說下載一個大的位圖到內存中可能會拋出一個outOfMemory異常,所以我應該縮放這個位圖來佔用內存上更小的空間。問題是,頁面上的代碼僅解釋如何使用資源圖像來完成此操作,而不是來自內部存儲器的圖像。所以,我有兩個問題:

如何從內部存儲位圖?

而且

有沒有一種方法來下載和保存圖像都以某種方式?

我第一次創建一個位圖圖像,然後將它傳遞給將保存它的方法,所以我假設圖像被完全加載到內存中,然後它被保存到內部存儲。

+0

扔掉BitmapFactory。 Indead應該創建一個循環,從輸入流中讀取塊並將它們直接寫入文件輸出流。 – greenapps

+0

你正在談論'內部記憶',但是如果這成爲現實,我們就無法在'filePath'上看到。 – greenapps

+0

它看起來不像加載位圖的問題。 – greenapps

回答

0

從內部存儲器加載圖像不是問題,除非像在ViewPager中一次加載大量圖像。或者你的圖像真的很大。但如果不是這樣的話,你應該沒問題。

關於下載圖片,我強烈建議您不要選擇「全部以單向方式」。因爲面向對象編程。此外,請嘗試使用Volley下載您的圖像。

+0

我正在從內部存儲中加載它們,但它們像800x600圖像一樣適合消息的50x50圓形圖像視圖,就像gmail一樣,所以我真的應該處理它們。沒有一種簡單的方法可以在不使用Volley的情況下將圖像寫入零件?我真的需要一個小的解決方案。我認爲,爲位圖處理解決了,我沒有看到一個方法decodeFile存在,我認爲這只是decodeResource https://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeFile(java .lang.String) – Gatonito

+0

@Gatonito實際上你真正需要做的是計算樣本大小。 在這裏,https://developer.android.com/training/displaying-bitmaps/load-bitmap.html – klutch

0

你可以用初級講座代碼嘗試:

public void loadPhotoToView(String path) { 
     File imgFile = new File(path); 
     if (imgFile.exists()) { 
      imageView.setImageBitmap(decodeFile(imgFile)); 
     } 
    } 

    // Decode image and scale it to reduce memory consumption 
    public Bitmap decodeFile(File f) { 
     try { 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

      // The new size we want to scale to, the bigger the better of quality 
      final int REQUIRED_SIZE = 200; 

      // Find the correct scale value. It should be the power of 2. 
      int scale = 1; 
      while (o.outWidth/scale/2 >= REQUIRED_SIZE && 
        o.outHeight/scale/2 >= REQUIRED_SIZE) { 
       scale *= 2; 
      } 

      // Decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize = scale; 
      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
     } catch (FileNotFoundException e) { 
     } 
     return null; 
    } 

另一種方法是使用一個庫如畢加索加載圖像:

Picasso.with(this).load(imgFile).into(imageView); 
相關問題