0

所以我注意到在某些设备上,我捕获的图像(位图)被奇怪地旋转了——通常是 90 度。我确实创建了一个可以正确旋转它的函数,但现在的问题是,有时图像进来(被捕获)完全没问题。有没有办法可以找出捕获的图像是否旋转(它的方向)?

我找到了这样的代码片段:

  try {
     ExifInterface exif = new ExifInterface(filename); 
     int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
                      ExifInterface.ORIENTATION_NORMAL);
     int rotate = 0;
     switch(orientation) {
        case  ExifInterface.ORIENTATION_ROTATE_270:
             rotate-=90;break;
        case  ExifInterface.ORIENTATION_ROTATE_180:
             rotate-=90;break;
        case  ExifInterface.ORIENTATION_ROTATE_90:
             rotate-=90;break;
        }
      ...    
    }

ExifInterface exif = new ExifInterface(filename);期望创建一个文件或文件 uri。这是否意味着我必须先将位图更改为文件,然后再使用这种方法,还是有其他方法可以解决这个问题?

PS我正在使用Android's Camera X

4

3 回答 3

0

推荐使用 AndroidX ExifInterface 库。如果捕获的图像是 Jpeg,则可以通过使用 InputStream 包装缓冲区来使用ExifInterface(InputStream) 。

于 2019-07-13T06:32:44.457 回答
0

不同设备的传感器方向不同。CameraX 尊重这一点,并在回调中返回带有旋转值的图像,可用于将其垂直旋转。 https://developer.android.com/reference/androidx/camera/core/ImageCapture.OnImageCapturedListener.html#onCaptureSuccess(androidx.camera.core.ImageProxy,%20int)

于 2019-07-16T03:46:55.627 回答
0

你可以试试这个

        Bitmap rotateBitmap(String src, Bitmap bitmap) {
        DebugLog.write();

        int orientation;

        try {
            orientation = getExifOrientation(src);
        } catch (IOException e) {
            e.printStackTrace();
            return bitmap;
        }

        Matrix matrix = new Matrix();

        switch (orientation) {
            case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                matrix.setScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                matrix.setRotate(180);
                break;
            case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                matrix.setRotate(180);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_TRANSPOSE:
                matrix.setRotate(90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                matrix.setRotate(90);
                break;
            case ExifInterface.ORIENTATION_TRANSVERSE:
                matrix.setRotate(-90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                matrix.setRotate(-90);
                break;
            case ExifInterface.ORIENTATION_NORMAL:
            default:
                return bitmap;
        }

        try {
            Bitmap oriented = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            bitmap.recycle(); //wht
            return oriented;
        } catch (OutOfMemoryError e) {
            e.printStackTrace();
        }

        return bitmap;
    }

    private int getExifOrientation(String src) throws IOException {
        DebugLog.write();
        ExifInterface exifInterface = new ExifInterface(src);
        return exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
    }
于 2019-08-08T12:56:28.983 回答