2017-12-08 22 views
0

サイズ制限を500KBに固定して私のサーバーにJPGファイルを送信します。このファイルは電話機のストレージに書き込まないでください(機密データが含まれています)。ファイルを作成せずにRequestBodyにJPGイメージを圧縮

私の入力は、カメラから返されたバイト配列です。今、このために

は、私はどのように私はこのサイズの制約と私のRequestBodyを作成することができます

public Observable<User> uploadPicture(byte[] pictureBytes) { 
    RequestBody pictureFormatted = RequestBody.create(MediaType.parse("image/*"), pictureBytes); 
    MultipartBody.Part picturePart = MultipartBody.Part.createFormData("confidentialPicture", "confidentialPicture.jpg", pictureFormatted); 

    return api.uploadPicture(picturePart); 
} 

をやって何ですか?私は画質を縮小することで大丈夫です。

+1

画像の質を下げるには、Bitmap.compressメソッドを使用しますか?もしそうなら、問題は何ですか? – pskink

+0

@pskink [このメソッドについて]話している場合(https://developer.android.com/reference/android/graphics/Bitmap.html#compress(android.graphics.Bitmap.CompressFormat、int、java.io.OutputStream ))OutputStreamが必要で、電話機のストレージに存在する出力ファイルなしでこれを実現する方法が見つかりません。 – Louis

+0

'このサイズ制約でRequestBodyを作成するにはどうしたらいいですか? '。奇妙な質問。あなたは今のようにそうするでしょう。しかし、 'byte [] pictureBytes'に500000バイト以上が含まれていれば、それらを少なくする必要があります。 – greenapps

答えて

0

これは、ビットマップ

を使用して達成することができ、私はちょうど私の写真を圧縮するByteArrayOutputStreamでビットマップを使用していたが、私は出力には、正確なサイズを取得する方法を見つけることができませんでした。

public static byte[] compressCapture(byte[] capture, int maxSizeKB) { 

    // This should be different based on the original capture size 
    int compression = 12; 

    Bitmap bitmap = BitmapFactory.decodeByteArray(capture, 0, capture.length); 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, compression, outputStream); 
    return outputStream.toByteArray(); 
} 

public Observable<User> uploadPicture(byte[] pictureBytes) { 
    RequestBody pictureFormatted = RequestBody.create(MediaType.parse("image/*"), compressCapture(pictureBytes, 500)); 
    MultipartBody.Part.createFormData("confidentialPicture", "confidentialPicture.jpg", pictureFormatted); 

    return api.uploadPicture(picturePart); 
} 
関連する問題