2013-08-27 28 views
0

我有4行代碼下載一個位圖,的InputStream - 在什麼時候是數據下載

URL u = new URL(webaddress); 

InputStream in = null; 

in = u.openStream(); 

icon = BitmapFactory.decodeStream(in); 

我打算將最後一行做類似這樣tutorial一些地方我只加載到記憶設置大小的圖像以減少內存使用量。不過,我不希望這涉及到另一個服務器調用/下載,所以我很好奇上面四行中的哪一行實際上從源下載數據?

即時將要改變的代碼的最後一行到上述教程中的最後兩個功能,所以可以做知道它是否意味着下載更多或更少的數據,(我試圖只下載一個小圖像從一個可能是例如500萬像素)

道歉,如果這是簡單的/錯誤的方式來思考它我不是很有經驗的數據流。


EDIT

使用這兩個功能,以取代上面的代碼的最後一行IM: 主叫:

image = decodeSampledBitmapFromStram(in, 300,300); 

圖像品質是不是一個的優先級,將這個意味着更多數據下載?

private static int calculateInSampleSize(BitmapFactory.Options options, 
      int reqWidth, int reqHeight) { 
     final int height = options.outHeight; 
     final int width = options.outWidth; 
     int inSampleSize = 1; 

     if (height > reqHeight || width > reqWidth) { 

      // Calculate ratios of height and width to requested height and 
      // width 
      final int heightRatio = Math.round((float) height 
        /(float) reqHeight); 
      final int widthRatio = Math.round((float) width/(float) reqWidth); 

      // Choose the smallest ratio as inSampleSize value, this will 
      // guarantee 
      // a final image with both dimensions larger than or equal to the 
      // requested height and width. 
      inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
     } 

     return inSampleSize; 
    } 

    private Bitmap decodeSampledBitmapFromStream(InputStream in, int reqWidth, int reqHeight) { 
     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     Rect padding = new Rect(); 
     BitmapFactory.decodeStream(in, padding, options); 

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

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 

     return BitmapFactory.decodeStream(in, padding, options); 
    } 
+0

您可以將輸入流讀入緩衝區,然後從緩衝區創建輸入流 – Cruncher

回答

1

您的四行中的最後一行負責整個下載。 BitmapFactory.decodeStream(in);將繼續從該流中提取數據,直到整個圖像被下載或中途出現錯誤。

至於帶寬問題,我會非常小心地理解解碼器如何在嘗試出來之前下采樣大圖片。在將較大尺寸的圖像縮小到較小尺寸時,以高質量方式進行此操作的唯一方法是通過平均原始圖像中的像素來進行縮減採樣。如果解碼器以這種方式進行下采樣,則不會保存任何帶寬,因爲解碼器仍然需要讀取原始圖像的每個像素,即使並非每個像素都存儲在RAM中。您可以通過不讀取原始圖像中的每個像素,以最終圖像質量爲代價更快地縮小採樣率。沿着這一思路,我也注意到了一個選項,寧願「質量比速度」:

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPreferQualityOverSpeed

我有,對於這個特殊的選項,通過讀取更少的數據獲得更多速度的感覺,但是API狀態這隻適用於JPEG。不確定這是否有助於您的特定用例,但可能值得深入研究。

+0

因此,根據我更喜歡速度和減少的質量下載數據的假設,您會建議我堅持使用第4行代碼還是將其與兩個功能? – Edd

+0

如果「喜歡速度」按我認爲的方式工作,那麼它會減少讀取的數據量,從而減少所需的帶寬。如果它不這樣工作,那麼就不會有帶寬差異,並且最好保留原始代碼。如果一切都失敗了,就試試它們,看看你能否確定哪個版本讀取更多的數據。有什麼方法可以在方法調用的decodeResource版本中使用'InputStream'?如果是這樣,你可以用它來確定讀取的字節數(例如下載)。 – CodeBlind

+0

我將如何使用InputStream來測量讀取的字節數?我可以修改兩個代碼以訪問InputStream – Edd

1

以下文檔將有助於您更好地瞭解流媒體http://docs.oracle.com/javase/tutorial/essential/io/streams.html。簡而言之,一旦建立到資源位置的連接,就會檢索/讀取確定大小的緩衝區(部分數據)。通常,這個過程一直持續到讀取所有的部分。

串流的主要優點是以零食的方式進行操作。例如,假設您想要下載500 MB大小的圖像。流式傳輸不是一次性傳輸,而是允許以塊的形式下載。這在錯誤處理,重試,高峯網絡利用率等方面更好。

相關問題