2015-11-06 44 views
0

我們正嘗試將一個image下載到Android上,以便在應用程序中查看它。我們可以加載它,但由於內存問題,無法下載。該圖像是9MB,但分辨率如此之大我想象這是一個Android的閱讀它的問題?將一個巨大的圖像下載到Android上(6144x32768)

嘗試: 寫直SD 畢加索 的OpenStream

URL url = new URL(link); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setDoInput(true); 
connection.connect(); 
InputStream input = connection.getInputStream(); 
Bitmap myBitmap = BitmapFactory.decodeStream(input); 

和錯誤:

Java.lang.OutOfMemoryError: Failed to allocate a 805306380 byte allocation with 8329762 free bytes and 180MB until OOM 

我們需要實際下載圖像,但是。

+0

那麼你的問題是什麼?無法下載圖片?你不知道如何顯示一塊圖像? – Tom

+0

實際從服務器下載圖像並對其進行解碼時,我們遇到了內存不足問題。我們正在使用BitmapFactory.decodestream –

+1

你能發佈相關代碼嗎? – Tom

回答

0

由於ARGB位圖需要每像素4字節,因此一張6k乘32k的圖像在完全加載時將佔用大約800 MB的內存。

當您通過USB進行復制時,它正在工作的原因很可能是因爲Android會將巨大圖片轉碼爲適合手機顯示的大小,這些大小通過MTP進行復制。

可以使用縮減採樣(Bitmap.Options.inSampleSize參數)或BitmapRegionDecoder來縮減採樣或顯示圖像的部分區域。

另一種選擇是Subsampling Scale Image View這樣的庫,可以處理所有這一切對你來說,如下面的代碼:

SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)findViewById(id.imageView); 
imageView.setImage(ImageSource.uri("http://training-slides.com/slides-image/slide-one.jpeg")); 

一旦在圖像視圖加載圖像,你可以使用雙指 - 縮放和觸摸平移來瀏覽圖像。

+0

這是我們正在使用的庫,嘗試了我們得到的代碼:無法初始化位圖解碼器 11-06 03:39:55.592 19690-21365/com.training_slides.www.slides E/SubsamplingScaleImageView:java.io. FileNotFoundException:沒有內容提供者:http://training-slides.com/slides-image/slide-one.jpeg –

+0

是的,它看起來像它不能直接從HTTP uris加載圖像。嘗試將文件首先從HTTP源複製到臨時文件,然後將文件路徑提供給SubsamplingScaleImageView。 – Marius