从相机接收的位图具有错误的方向/旋转

时间:2016-08-04 09:03:08

标签: java android camera imageview

我使用Camera意图捕获android上的照片,当onActivityResult的意图返回位图时,它在某些手机上的方向错误。 我知道有办法解决这个问题,但我见过的所有解决方案都谈到了存储在文件中的图像。 我从意图中检索的是直接位图图像。我想知道如何获取位图的exif数据,然后更正其方向。我再说一遍,我已经看到了处理文件而不是位图的答案,所以请在投票之前考虑一下。

 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
      startActivityForResult(takePictureIntent, Constants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
 }

结果如下

Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");

如何获得方向并旋转它。

1 个答案:

答案 0 :(得分:0)

<强>更新

Exif是一种将一些信息数据插入JPEG的文件格式。 https://www.media.mit.edu/pia/Research/deepview/exif.html

Bitmap是数据结构数据保存行像素数据,没有exif信息 所以我认为从Bitmap获取exif信息是不可能的 没有方法可以获取exif信息 https://developer.android.com/reference/android/graphics/Bitmap.html

<强> ORIGINAL

我同意@DzMobNadjib。 我认为旋转的信息只是exif。 要采取exif,我建议您采取以下步骤。

<强> 1。使用文件路径启动相机活动。

参见 [保存全尺寸照片] 捕捉this document

您可以使用文件路径启动相机活动。相机活动会将图像保存到您传递的文件路径中。

<强> 2。在&#39; onActivityResult&#39;中,关注this answer (如@DzMobNadjib建议的那样)

您的代码将是这样的:
(对不起,我没有经过测试。请仔细阅读并按照上述答案)

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == Constants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
            Uri uri = data.getData();
            Bitmap bitmap = getAdjustedBitmap(uri);
        }
    }
}

private Bitmap getAdjustedBitmap(Uri uri) {
    FileInputStream is = null;
    try {
        ExifInterface exif = new ExifInterface(uri.getPath());

        int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

        int rotationInDegrees = exifToDegrees(rotation);

        Matrix matrix = new Matrix();
        if (rotation != 0f) {
            matrix.preRotate(rotationInDegrees);
        }

        is = new FileInputStream(new File(uri.getPath()));
        Bitmap sourceBitmap = BitmapFactory.decodeStream(is);

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

        return Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true);

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
            }
        }
    }
    return null;
}

private static int exifToDegrees(int exifOrientation) {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; }
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {  return 180; }
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {  return 270; }
    return 0;
}