MediaStore.Images.Media.getBitmap(getActivity().getContentResolver() 始终将垂直图像旋转为水平

问题描述 投票:0回答:1

在我的应用程序中,我只是尝试从图库中选择多个图像并在上传到服务器之前在回收器视图中显示。在 recyclerview 中,图像以原始方向显示。然而,在上传到服务器之前,它总是将所有垂直图像旋转 90 度,将垂直图像(宽度 * 高度 = 720 * 1280)转换为水平(宽度 * 高度 = 1280 * 720)格式。我根本不希望我的垂直图像改变方向。我检查了所有代码,我可以得出以下代码以某种方式进行旋转的结论。

  for (int i = 0; i < current_count; i++) {
                    index = i;
                    try {
                        assert getActivity() != null;
                        bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uris.get(i));

                        int width = bitmap.getWidth();
                        int height = bitmap.getHeight();

                        Log.d("Logs", "--width, height-" + width + "-" + height + "--");

                        converetdBitmap = getResizedBitmap(bitmap, 1280);
                        uploadImagesToDatabase(i, converetdBitmap, current_count);

                    } catch (IOException e) {
                       
                    }
                }
    public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
        int width = image.getWidth();
        int height = image.getHeight();

        Log.d("Logs", "--width, height-" + width + "-" + height + "--");

        float bitmapRatio = (float) width / (float) height;
        if (bitmapRatio > 1) {
            width = maxSize;
            height = (int) (width / bitmapRatio);
        } else {
            height = maxSize;
            width = (int) (height * bitmapRatio);
        }

        Log.d("logs", "-- width, height-" + width + "-" + height + "--");
        return Bitmap.createScaledBitmap(image, width, height, true);
    }

在 Log.d("Logs"....) 输出中 - 始终获得 1280 * 720,而我的原始图片大小为 720 * 1280。因此,我的函数代码 getResizedBitmap() 中没有问题。罪魁祸首似乎是这个命令 - 位图 = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uris.get(i));

请帮我解决这个问题。谢谢你!

java android bitmap android-bitmap mediastore
1个回答
0
投票

当我尝试显示相机中的图像时,我曾经遇到过类似的问题。对我来说,原因是我忘记改变图像的方向。以下是我用来从 File 和 Uri 读取方向的两种便捷方法:

fun File.orientation(): Int {
    try {
        val exif = ExifInterface(absolutePath)
        return when (exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0)) {
            6 -> 90
            3 -> 180
            8 -> 270
            else -> 0
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return 0
}

fun Uri.orientation(context: Context): Int {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        try {
            val exif = ExifInterface(context.contentResolver.openInputStream(this))
            return when (exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0)) {
                6 -> 90
                3 -> 180
                8 -> 270
                else -> 0
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
    return 0
}

然后,您需要使用

Bitmap#rotate()
相应地旋转位图。

此外,请注意在将位图加载到内存之前对其进行缩放,因为如果加载太多内存,可能会导致 OOM。最佳实践是首先测量图像尺寸,例如,

 val options = BitmapFactory.Options()
 options.inJustDecodeBounds = true
 options.inSampleSize = 1
 uri.decodeBitmap(context, options)

这里我们使用

inJustDecodeBounds
告诉系统我们只需要图像的大小,而不是将整个图像加载到内存中。

Android 中的图片加载有点复杂,有兴趣的可以访问我的开源项目了解详情:https://github.com/Shouheng88/Compressor .

祝愿,希望对你有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.