2017-12-08 6 views
0

Ich möchte eine JPG-Datei an meinen Server mit einer Größenbeschränkung von 500KB senden. Diese Datei sollte niemals in den Telefonspeicher geschrieben werden (sie enthält vertrauliche Daten).JPG-Bild in RequestBody komprimieren, ohne eine Datei zu erstellen

Meine Eingabe ist ein Byte-Array von der Kamera zurückgegeben.

Denn jetzt ist das, was ich

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); 
} 

Wie mache ich meine RequestBody mit dieser Größe Constraint erstellen? Ich bin in Ordnung mit der Verringerung der Bildqualität.

+1

Wenn Sie also die Bildqualität verringern möchten, dann verwenden Sie 'Bitmap.compress' Methode, richtig? Wenn ja, was ist das Problem? – pskink

+0

@pskink, wenn Sie über [diese Methode] sprechen (https://developer.android.com/reference/android/graphics/Bitmap.html#compress (android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream)) es erfordert einen OutputStream und ich kann nicht finden, wie dies ohne eine Ausgabedatei erreicht wird, die im Telefonspeicher existiert. – Louis

+0

'Wie kann ich mein RequestBody mit dieser Größenbeschränkung erstellen? '. Komische Frage. Du würdest das tun wie du es jetzt tust. Aber wenn 'byte [] pictureBytes' mehr als 500000 Bytes enthält, möchten Sie sie weniger machen. – greenapps

Antwort

0

Dies kann mit einem Bitmap

erreicht werden musste ich einfach eine Bitmap mit einem ByteArrayOutputStream verwenden, um mein Bild zu komprimieren, aber ich konnte nicht einen Weg finden, eine genaue Größe in Ausgabe zu erhalten.

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); 
} 
Verwandte Themen