【问题标题】:Android - Find the orientation of photo was took by cameraAndroid - 查找照片的方向是由相机拍摄的
【发布时间】:2012-01-10 17:39:53
【问题描述】:

我需要拍一张照片,找出它的方向,在画布上绘制它并旋转画布。我需要帮助来确定照片的方向

【问题讨论】:

    标签: android camera exif


    【解决方案1】:

    您需要使用照片中嵌入的EXIF标签:

    private int getExifOrientation() {
      ExifInterface exif;
      int orientation = 0;
      try {
        exif = new ExifInterface( mImagePath );
        orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, 1 );
      } catch ( IOException e ) {
        e.printStackTrace();
      }
      Log.d(TAG, "got orientation " + orientation);
      return orientation;
    }
    

    但是,返回的实际 EXIF 值有点奇怪。它允许各种旋转和镜像。我找到的最佳参考是here。通常,在获得方向后,您需要通过查找函数运行它以获取以度数为单位的旋转:

    private int getBitmapRotation() {
      int rotation = 0;
      switch ( getExifOrientation() ) {
        case ExifInterface.ORIENTATION_ROTATE_180:
          rotation = 180;
          break;
        case ExifInterface.ORIENTATION_ROTATE_90:
          rotation = 90;
          break;
        case ExifInterface.ORIENTATION_ROTATE_270:
          rotation = 270;
          break;
      }
    
      return rotation;
    }
    

    【讨论】:

    • 我收到错误“01-11 00:51:37.687: ERROR/JHEAD(7055): can't open '/file:/mnt/sdcard/.temp/photo1151619024.jpg'”那行“exif = new ExifInterface(mImagePath);”
    • 我确定该文件仍然存在,并且我已经在清单中设置了权限 android.permission.WRITE_EXTERNAL_STORAGE
    • /file:/ 看起来不像是路径的正确部分...它可能只是 /mnt/sdcard/...
    • @stoneheart 你找到解决方案了吗?
    【解决方案2】:

    我正在寻找类似的解决方案来解决我的问题。我正在从相机或画廊拍摄照片并将其转换为位图以在我的应用程序中使用。问题是在 PORTRAIT 中拍摄的照片被旋转了 -90 度。

    搜索答案我发现这篇文章和https://stackoverflow.com/a/11081918/3062284 非常相似。我实际上使用了后一个帖子。但是,就像@StoneHeart 我在读取图像路径时遇到错误。

    我在 onActivityResult() 中使用了这段代码:

    case CAMERA_REQUEST_CODE:
    if (resultCode == RESULT_OK);
    uriImage = data.getData(); 
    ExifInterface exif = new ExifInterface(uriImage.getPath());
    

    由于以前的 cmets 没有解决此错误,我想我会分享我使用 https://stackoverflow.com/a/10564727/3062284 找到的解决方案

    我需要使用帖子中的这种方法的文件的真实路径。

         private String getRealPathFromURI(Uri contentUri) {
            String[] proj = { MediaStore.Images.Media.DATA };
            CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null);
            Cursor cursor = loader.loadInBackground();
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
    

    并将我的代码编辑为以下内容:

    case CAMERA_REQUEST_CODE:
    if (resultCode == RESULT_OK);
    uriImage = data.getData();
    String imagePath = getRealPathFromURI(uriImage); 
    ExifInterface exif = new ExifInterface(imagePath);
    

    这解决了我遇到的“JHEAD 无法打开文件”错误。

    【讨论】:

    • Boom 你刚刚结束了我 2 小时的问题!
    • JHead 问题的最佳解决方案
    【解决方案3】:

    你能根据照片的高度和宽度确定方向吗?如果它比它高,它是风景。如果它的高度大于宽度,则为纵向。

    如果它是方形的,那么您必须读取 EXIF 数据并希望它是为这些图像设置的。 EXIF 数据应提供方向数据。

    【讨论】:

    • 不,它们的宽度和高度相同
    • 尺寸不够——它可能是横向的但倒置,这取决于我将手机向左还是向右拍照。
    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2011-12-17
    相关资源
    最近更新 更多