2012-04-27 8 views
2

良い一日の仲間の開発者。Androidポスト高解像度画像メモリ不足のため

私はアプリから画像をアップロードするためにアンドロイドに忙しいです。
私はそれも働いています(コードは以下に従います)。
しかし、大きな画像(10メガピクセル)を送信すると、アプリがメモリ不足の例外でクラッシュします。
これを解決するには圧縮を使用しますが、フルサイズの画像を送信する場合はどうすればよいですか?
私はおそらくストリームで何かと思うが、私はストリームと家族ではない。おそらくurlconnectionは役に立ちますが、私は本当に分かりません。

私は、ファイル名に名前のファイルを与える[0〜9999] .JPG 画像の日付とポストの値が、私は

作品が、私以下のコードdropboxidポスト値のUIDを与えるFILEDATA と呼ばれ、高解像度の画像を送信できないように私の問題を解決したいと考えています。 ByteArrayOutputStreamを使用して、あなたが効果的に JPEGが使用しているメモリの量を倍増してきました#toByteArray()を呼び出すとき

種類は

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は、エンコードされたJPEGの内部配列を保持します。#toByteArray()を呼び出すと、newの配列&が内部バッファからデータをコピーします。

は、画像を符号化し、送信する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カード上に)保存されています。私がアップロードを開始したときだけ、そこからビットマップを取得します。 私の主な問題は、そのファイルからinputstreamをどのように取得し、それを自分のエンティティで投稿できるoutputstreamに変換できるのか分かりません。ビットマップコード ビットマップ=ビットマップファクトリ。デコードファイル(パス) ここで私はByteArrayBody bab = fileinputstream(パス)のような何かをしなければならないのですか? – user1195015

+0

だから、なぜあなたはビットマップをフェッチしますか?ソースファイルはPNGで、WebサーバーはPNGのみを受け入れますか?さもなければ、既に持っているファイルをアップロードするだけです.JPEGを再エンコードすると、画像に不自然なアーチファクトが発生する可能性が高くなります。 **編集**:Apacheのいくつかの追加のlibをインポートしましたか?その場合、 'FileBody'クラスが必要です。あなたはそれを使用することができます – Jens

+0

私が好きなほとんどすべてのファイルタイプを送信することができます。しかし、私はまだファイルからバイトを取得する方法の手掛かりがありません。しかし、アイデアは良いので、私はgoogleに行くと思う。または、簡単な例があればそれはいいと思います。もし私が何かを見つけたら、私はそれを掲示するでしょう。アドバイスをありがとう – user1195015

関連する問題