Android-图库和相机旋转问题。修复了相机预览,但是图库中的照片仅在相机照片中显示错误的方向

时间:2018-11-16 06:14:40

标签: java android

我几乎检查了有关该主题的所有问答。但是,我找不到合适的解决方案。

我正在开发OCR应用程序,并且手机的定位问题。最后,我修复了Camera Preview部分。而且,OCR可以正确定向图像。

Babou

但是,现在,画廊的照片又出现了另一个问题。当我从图库中加载照片时,只有使用“相机”按钮(向左按钮)拍照的照片才有该问题。 Google的其他照片效果很好。因此,我认为问题出在相机功能上,因为它没有改变Google照片或其他应用程序中任何其他照片的方向。

所以,我认为这是保存文件的问题。所以,我尝试了这种方法。

public static void saveBitmaptoJpeg(Bitmap bitmap, String folder, String name) {
     String ex_storage = Environment.getExternalStorageDirectory().getAbsolutePath(); // Get Absolute Path in External Sdcard
     String foler_name = "/" + folder + "/";
     String file_name = name + ".jpg";
     String string_path = ex_storage + foler_name;
     File file_path;
     try {
         file_path = new File(string_path);
         if (!file_path.isDirectory()) {
            file_path.mkdirs();
         }
         FileOutputStream out = new FileOutputStream(string_path + file_name);
         bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
         out.close();
     } catch (FileNotFoundException exception) {
         Log.e("FileNotFoundException", exception.getMessage());
     } catch (IOException exception) {
         Log.e("IOException", exception.getMessage());
     }
 }

保存。并加载正确方向的照片。但是,它不起作用。所以,我用这些方法检查照片的方向。

 public Bitmap modifyOrientation(Bitmap bitmap, String image_absolute_path) throws IOException {
    ExifInterface ei = new ExifInterface(image_absolute_path);
    int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
    Log.d(TAG, "갤러리 orientation: " + orientation);

    switch (orientation) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            return rotate(bitmap, 90);

        case ExifInterface.ORIENTATION_ROTATE_180:
            return rotate(bitmap, 180);

        case ExifInterface.ORIENTATION_ROTATE_270:
            return rotate(bitmap, 270);

        case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
            return flip(bitmap, true, false);

        case ExifInterface.ORIENTATION_FLIP_VERTICAL:
            return flip(bitmap, false, true);

        default:
            return bitmap;
    }
}

public Bitmap rotate(Bitmap bitmap, float degrees) {
    Matrix matrix = new Matrix();
    matrix.postRotate(degrees);
    return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}

public Bitmap flip(Bitmap bitmap, boolean horizontal, boolean vertical) {
    Matrix matrix = new Matrix();
    matrix.preScale(horizontal ? -1 : 1, vertical ? -1 : 1);
    return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}

它表示方向为0。另一方面,当我拍摄照片时,方向为6(*指向|,*为顶部的照片)

我将这些方法用于Camera。

 // 카메라 결과 알맞게 조절
private int resolveBitmapOrientation(File bitmapFile) {
    Log.d(TAG, "resolveBitmapOrientation: " + bitmapFile.getAbsolutePath());
    if (!bitmapFile.exists()) {
        Log.d(TAG, "bitmapFile 존재하지 않음.");
    } else {
        Log.d(TAG, "bitmapFile 존재함.");
    }

    ExifInterface exif = null;
    try {
        exif = new ExifInterface(bitmapFile.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }

    return exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
}

private Bitmap applyOrientation(Bitmap bitmap, int orientation) {
    int rotate = 0;
    switch (orientation) {
        case ExifInterface.ORIENTATION_ROTATE_270:
            rotate = 270;
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            rotate = 180;
            break;
        case ExifInterface.ORIENTATION_ROTATE_90:
            rotate = 90;
            break;
        default:
            return bitmap;
    }

    int w = bitmap.getWidth();
    int h = bitmap.getHeight();
    Matrix mtx = new Matrix();
    mtx.postRotate(rotate);
    return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}

我认为相机的方法也可能对图库照片有用。因此,我应用了那些方法。但这也不起作用。

如何解决此问题?

0 个答案:

没有答案