2012-04-27 43 views
2

好日子開發者。Android發佈高分辨率圖像內存不足

我忙於Android上傳應用程序的圖像。
我也得到它的工作(代碼將在下面)。
但是,當我發送大圖像(10萬像素)我的應用程序崩潰與內存不足的例外。
解決方案是使用壓縮,但如果我想發送全尺寸圖像怎麼辦?
我想也許有一些東西與流,但我不是familair與流。也許urlconnection可能有幫助,但我真的不知道。

我給的文件名文件的名稱[0至9999] .JPG 的崗位價值與形象的日期也叫Filedata上 我給這個職位值UID dropboxid

下面的作品,但我的代碼會很樂意解決我的問題,阻止我發送高分辨率圖像。

親切的問候

try 
{ 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    bitmap.compress(CompressFormat.JPEG, 100, bos); 
    byte[] data = bos.toByteArray(); 

    HttpPost postRequest = new HttpPost(URL_SEND); 

    ByteArrayBody bab = new ByteArrayBody(data, "File" + pad(random.nextInt(9999) + 1) + ".jpg"); 
    MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    reqEntity.addPart("Filedata", bab); 
    reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid))); 
    postRequest.setEntity(reqEntity); 

    HttpResponse response = httpClient.execute(postRequest); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
    String sResponse; 
    StringBuilder s = new StringBuilder(); 

    while((sResponse = reader.readLine()) != null) 
    { 
     s = s.append(sResponse); 
    } 

    if(d) Log.i(E, "Send response:\n" + s); 
} 
catch (Exception e) 
{ 
    if(d) Log.e(E, "Error while sending: " + e.getMessage()); 
    return ERROR; 
} 

回答

3

當使用ByteArrayOutputStream,然後調用#toByteArray()你有效一倍的JPEG使用的內存量。 ByteArrayOutputStream保留一個帶有編碼JPEG的內部陣列,當您撥打#toByteArray()時,它會分配一個新的陣列&從內部緩衝區複製數據。

考慮使用FileOutputStreamFileInputStream編碼併發送圖像,將大位圖編碼爲臨時文件&。

如果沒有「上傳」 - 您的應用程序只能在內存中的巨大位圖「很好」地存活下來?

編輯:FileBody

File img = new File(this is where you put the path of your image) 
ContentBody cb = new FileBody(img, "File" + pad(random.nextInt(9999) + 1) + ".jpg", "image/jpg", null); 
MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
reqEntity.addPart("Filedata", cb); 
reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid))); 
+0

在我的應用我只存儲到文件的引用。所以文件已經存儲(在SD卡上)。只有當我開始上傳時,我會從中獲取位圖。 我的主要問題是,我不知道如何從輸入流中獲取該文件並將其轉換爲可以與我的實體一起發佈的輸出流。位圖代碼 bitmap = BitmapFactory.decodeFile(path); 所以這裏我必須做一些像ByteArrayBody bab = fileinputstream(路徑)? – user1195015 2012-04-27 13:00:12

+0

所以..你爲什麼要獲取位圖?源文件是PNG還是Web服務器只接受PNG?否則 - 只需上傳你已有的文件 - 重新編碼一個這樣的JPEG很可能只是在圖像中引入更多古怪的文物。 **編輯**:你已經導入了一些額外的Apache庫正確嗎?在這種情況下,你應該有'FileBody'類。你可以使用那個 – Jens 2012-04-27 13:04:00

+0

我可以發送幾乎任何我喜歡的文件類型。但是我仍然不知道如何從文件中獲取字節。但這個想法很好,所以我認爲我會去那個谷歌。或者如果你有一個快速的例子,它會很好。如果我找到我會發布的東西。感謝您的建議 – user1195015 2012-04-27 13:06:28