2016-08-04 81 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