web-dev-qa-db-fra.com

Compresser l'image de la caméra avant le téléchargement

J'utilise ce code (depuis www.internetria.com ) pour prendre une photo et la télécharger sur un serveur:

onCreate:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri output = Uri.fromFile(new File(foto));
intent.putExtra(MediaStore.EXTRA_OUTPUT, output);
startActivityForResult(intent, TAKE_PICTURE);

onActivityResult:

ImageView iv = (ImageView) findViewById(R.id.imageView1);
        iv.setImageBitmap(BitmapFactory.decodeFile(foto));

        File file = new File(foto);
        if (file.exists()) {
            UploaderFoto nuevaTarea = new UploaderFoto();
            nuevaTarea.execute(foto);
        }
        else
            Toast.makeText(getApplicationContext(), "No se ha realizado la foto", Toast.LENGTH_SHORT).show();

UploaderFoto:

ProgressDialog pDialog;
String miFoto = "";

@Override
protected Void doInBackground(String... params) {
    miFoto = params[0];
    try { 
        HttpClient httpclient = new DefaultHttpClient();
        httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
        HttpPost httppost = new HttpPost("http://servidor.com/up.php");
        File file = new File(miFoto);
        MultipartEntity mpEntity = new MultipartEntity();
        ContentBody foto = new FileBody(file, "image/jpeg");
        mpEntity.addPart("fotoUp", foto);
        httppost.setEntity(mpEntity);
        httpclient.execute(httppost);
        httpclient.getConnectionManager().shutdown();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

Et je veux compresser l'image, car la taille est trop grande.

Je ne sais pas comment ajouter bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); à mon application

25
David

Jetez un œil ici: ByteArrayOutputStream à un FileBody

Quelque chose dans ce sens devrait fonctionner:

remplacer

File file = new File(miFoto);
ContentBody foto = new FileBody(file, "image/jpeg");

avec

Bitmap bmp = BitmapFactory.decodeFile(miFoto)
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 70, bos);
InputStream in = new ByteArrayInputStream(bos.toByteArray());
ContentBody foto = new InputStreamBody(in, "image/jpeg", "filename");

Si la taille du fichier est toujours un problème, vous souhaiterez peut-être redimensionner l'image en plus de la compresser.

36
Matthew Wesly

Convertir l'image en format Google WebP cela vous fera économiser beaucoup d'octets voir les deux articles suivants vous pouvez également convertir webP en JPG/PNG/GIF tout ce que vous voulez côté serveur.

Java Wrapper de l'API Google WebP

Comment vérifier la bibliothèque Google WebP et l'utiliser dans Android comme bibliothèque native

Tout d'abord, vous devez obtenir des pixels de Bitmap.

Bitmap bitmap = BitmapFactory.decodeFile(filePath);

int bytes = bitmap.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes);
bitmap.copyPixelsToBuffer(buffer);
byte[] pixels = buffer.array();

Ensuite, vous pouvez obtenir un tableau d'octets WebP.

int stride = bytes / height;
int quality = 100;
byte[] encoded = libwebp.WebPEncodeRGBA(pixels, width, height, stride, quality);

Test.png (Taille: 106KB) Test.png (Size: 106KB) Test.webp (Taille: 48KB) Test.webp(Size: 48KB)

5
AZ_

En utilisant okhttp, je télécharge comme ceci:

MediaType MEDIA_TYPE_PNG
                        = MediaType.parse("image/jpeg");

                //Compress Image
                Bitmap bmp = BitmapFactory.decodeFile(fileToUpload.getAbsolutePath());
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.JPEG, 70, bos);

                RequestBody requestBody = new MultipartBuilder()
                        .type(MultipartBuilder.FORM)
                        .addFormDataPart("photo", fileToUpload.getName(), RequestBody.create(MEDIA_TYPE_PNG, bos.toByteArray()))
                        .build();

                request = new Request.Builder()
                        .url(urlToUploadTo)
                        .post(requestBody)
                        .build();

                try {
                    response = client.newCall(request).execute();
                    if (response != null) {
                        if (response.isSuccessful()) {
                            responseResult = response.body().string();
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
1
user531069