【问题标题】:Bitmap received from camera has wrong orientation / rotated从相机接收到的位图方向错误/旋转
【发布时间】:2016-08-04 09:03:07
【问题描述】:

我正在使用相机意图在 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");

如何获得方向和旋转它。

【问题讨论】:

标签: java android camera imageview


【解决方案1】:

更新

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

原创

我同意@DzMobNadjib。 我认为轮换信息仅在 exif 中。 要获取 exif,我建议您采取以下步骤。

1.使用文件路径启动相机活动。

查看[保存全尺寸照片]捕获this document

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

2。在“onActivityResult”中,关注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;
}

【讨论】:

  • 我的问题是我可以从位图获取exif信息
猜你喜欢
  • 2017-06-30
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多