Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓-发现照片的方向是由相机拍摄的_Android_Camera_Exif - Fatal编程技术网

Android 安卓-发现照片的方向是由相机拍摄的

Android 安卓-发现照片的方向是由相机拍摄的,android,camera,exif,Android,Camera,Exif,我需要拍一张照片,找出它的方向,在画布上画它,然后旋转画布。我需要帮助来找出照片的方向你能根据照片的高度和宽度来确定方向吗?如果它的宽度大于它的高度,那就是风景。如果它比原来的宽高,那就是肖像 如果它是正方形的,那么你必须读取EXIF数据,希望它是为那些图像设置的。EXIF数据应提供方向数据。您需要使用嵌入照片中的EXIF标签: private int getExifOrientation() { ExifInterface exif; int orientation = 0; tr

我需要拍一张照片,找出它的方向,在画布上画它,然后旋转画布。我需要帮助来找出照片的方向你能根据照片的高度和宽度来确定方向吗?如果它的宽度大于它的高度,那就是风景。如果它比原来的宽高,那就是肖像


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

您需要使用嵌入照片中的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值有点奇怪。它允许各种旋转和镜像。我找到的最好的推荐信是。通常,在获得方向后,需要通过查找函数运行该方向,以获得以度为单位的旋转:

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;
}

我在寻找一个类似于我的问题的解决方案。我正在从相机或图库中拍摄照片,并将其转换为位图,以便在我的应用程序中使用。问题是人像照片被旋转了90度

在搜索答案时,我发现了这篇文章,而且答案非常相似。我实际上用了后一个帖子。然而,像@StoneHeart一样,我在读取图像路径时出错

我在onActivityResult()中使用了以下代码:

由于这个错误在之前的评论中没有得到解决,我想我会与大家分享我使用的解决方案

我需要文件的真实路径,使用本文中的此方法

     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无法打开文件”错误。

不,它们的宽度和高度都一样,但尺寸不够——可能是横向的,但可能是倒置的,这取决于我是将手机向左还是向右转来拍照。我遇到了错误“01-11 00:51:37.687:error/JHEAD(7055):无法打开“/file:/mnt/sdcard/.temp/photo1151619024.jpg””,在该行“exif=new ExifInterface(mImagePath);“我确信该文件仍然存在,并且我已经设置了权限。清单/文件中的android.permission.WRITE_EXTERNAL_存储区:/。。。可能只是/mnt/sdcard/…@stoneheart你找到解决方案了吗?你刚刚结束了我两个小时的问题!JHead问题的最佳解决方案
case CAMERA_REQUEST_CODE:
if (resultCode == RESULT_OK);
uriImage = data.getData();
String imagePath = getRealPathFromURI(uriImage); 
ExifInterface exif = new ExifInterface(imagePath);