2016-08-04 42 views
0

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

如何获得取向和旋转。

+2

的可能的复制([为什么图像捕捉通过相机获取的意图在机器人某些设备旋转] http://stackoverflow.com/questions/14066038/why-image-captured-using-camera-intent-在Android中获取旋转的某些设备) –

+0

@Mik elPascual该问题doest指定如何获得位图的exif,这正是我所说的在op –

+1

您可以看到这[回复](http://stackoverflow.com/a/11081918/5061288),我认为这是有帮助的。 –

回答

0

UPDATE

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.在 'onActivityResult',按照this answer(如@DzMobNadjib建议)

您的代码将是这样的:
(对不起,我没有测试过,请阅读carefuly,并按照上面的回答。 )

@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; 
} 
+0

我的问题是我可以从位图获取exif信息 –

+0

好吧,我更新了我的答案 – nshmura