将 android 文件上的图像缩放到文件

Scale image on android file to file

我正在尝试缩小图像,然后再将它们发送到我的 android 应用程序的后端。 目前我正在使用 BitmapFactory.decodeFile()inJustDecodeBounds 选项执行此操作。但它会跳过传感器信息,结果我得到了旋转的图像。我通过设置转换矩阵来修复它。这是我的代码:

        File image = new File(uri.getPath());

        int angle = 0;
        ExifInterface exif = null;
        try {
            exif = new ExifInterface(image.getPath());
            int orientation = exif.getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL);

            switch (orientation) {
                case ORIENTATION_ROTATE_90:
                    angle = 90;
                    break;

                case ORIENTATION_ROTATE_180:
                    angle = 180;
                    break;
                case ORIENTATION_ROTATE_270:
                    angle = 270;
                    break;
            }
        } catch (IOException e) {
            if (DEBUG) e.printStackTrace();
        }

        Matrix mat = new Matrix();
        mat.postRotate(angle);

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(image.getAbsolutePath(), options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

        options.inJustDecodeBounds = false;
        Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(), options);

        if (angle != 0) {
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mat, true);
        }

        if (DEBUG) {
            Log.d("COMPRESS", "scaled bitmap size: " + bitmap.getWidth() + "x" + bitmap.getHeight());
        }
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 40, buffer);
        bitmap.recycle();
        return buffer.toByteArray();

但是这种方法会导致 OOM 异常,因为它在内存中执行所有操作并且 每个非 0 度图像被加载到内存中两次。

更好的方法可能是直接缩放,将传感器和其他元数据信息直接保存到文件中。我为此尝试 ffmpeg libarary 但它挂了。

我尝试 google 其他一些库,但对于我的所有请求,它给了我如何在 ImageViewCanvas

中缩放图像的答案

那么有没有其他方法可以有效地缩放 android 上的图像? 谢谢。

我会使用 Picasso:http://square.github.io/picasso/ 因为它能够流畅地处理方向、调整大小和内存不足 API。

Bitmap smaller = Picasso.with(context)
   .load(new File(uri.getPath()))
   .resize(800, 800) // this is max size
   .centerInside()
   .get();

... carry on with compress code

https://github.com/square/picasso/issues/226