web-dev-qa-db-ja.com

アップロードする前にカメラ画像を圧縮する

私はこのコードを使用して( www.internetria.com から)写真を撮ってサーバーにアップロードします:

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

そして、サイズが大きすぎるので、画像を圧縮します。

アプリにbitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos);を追加する方法がわかりません

25
David

こちらをご覧ください: ByteArrayOutputStream to a FileBody

これらの線に沿って何かが動作するはずです:

取り替える

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

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

それでもファイルサイズが問題である場合は、圧縮に加えて画像を拡大縮小することもできます。

36
Matthew Wesly

画像を Google WebP形式 に変換すると、多くのバイトを節約できます。次の2つの記事を参照してください。サーバー側でwebPをJPG/PNG/GIFに変換することもできます。

Google WebP APIのJavaラッパー

Google WebPライブラリをチェックアウトして、Androidネイティブライブラリとして)で使用する方法

まず、ビットマップからピクセルを取得する必要があります。

Bitmap bitmap = BitmapFactory.decodeFile(filePath);

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

その後、WebPバイト配列を取得できます。

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

Test.png(サイズ:106KB) Test.png (Size: 106KB) Test.webp(サイズ:48KB) Test.webp(Size: 48KB)

5
AZ_

Okhttpを使用して、次のようにアップロードします。

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