2012-01-10 41 views

Trả lời

12

Bạn cần phải sử dụng thẻ EXIF ​​nhúng trong bức ảnh:

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

Tuy nhiên, giá trị thực tế EXIF ​​trở là sorta kỳ lạ. Nó cho phép cho tất cả các loại quay và phản chiếu. Tham chiếu tốt nhất tôi đã tìm thấy là here. Nói chung, sau khi bạn nhận được hướng, bạn sẽ muốn chạy thông qua chức năng tra cứu để xoay vòng theo độ:

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

Tôi gặp lỗi "01-11 00: 51: 37.687: ERROR/JHEAD (7055): không thể mở '/file:/mnt/sdcard/.temp/photo1151619024.jpg'" tại dòng đó "exif = new ExifInterface (mImagePath); " – StoneHeart

+0

Tôi chắc chắn rằng tập tin vẫn còn đó và tôi đã thiết lập cho phép android.permission.WRITE_EXTERNAL_STORAGE trong manifest – StoneHeart

+2

/file:/không giống như một phần thích hợp của đường dẫn ... có lẽ chỉ là/mnt/sdcard/... – elijah

1

Bạn có thể xác định hướng dựa trên chiều cao và chiều rộng của ảnh không? Nếu nó rộng hơn nó cao, đó là phong cảnh. Nếu nó cao hơn nó rộng, nó là bức chân dung.

Nếu hình vuông, thì bạn sẽ phải đọc dữ liệu EXIF ​​và hy vọng nó được đặt cho những hình ảnh đó. Dữ liệu EXIF ​​sẽ cung cấp dữ liệu định hướng.

+0

Không, chúng có cùng chiều rộng và chiều cao – StoneHeart

+0

Kích thước không đủ - có thể là cảnh quan nhưng lộn ngược, tùy thuộc vào việc tôi đã bật điện thoại sang trái hay phải để chụp ảnh. –

7

Tôi đang tìm kiếm giải pháp tương tự cho vấn đề của mình. Tôi đang chụp ảnh từ máy ảnh hoặc thư viện và biến nó thành một bitmap để sử dụng trong ứng dụng của tôi. Vấn đề là các bức ảnh chụp trong PORTRAIT đã được xoay -90 độ.

Tìm kiếm câu trả lời Tôi đã tìm thấy bài đăng này và https://stackoverflow.com/a/11081918/3062284 rất giống nhau. Tôi thực sự đã sử dụng bài đăng sau. Tuy nhiên, như @StoneHeart tôi đã gặp lỗi khi đọc Đường dẫn hình ảnh.

tôi đã sử dụng mã này trong onActivityResult của tôi():

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

Kể từ khi lỗi này được không được đề cập trong ý kiến ​​trước đó tôi nghĩ tôi sẽ chia sẻ những giải pháp tôi tìm thấy bằng https://stackoverflow.com/a/10564727/3062284

tôi cần thực đường dẫn cho tệp bằng phương thức này từ bài đăng.

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

và chỉnh sửa mã của tôi như sau:

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

và cố định "JHEAD không thể mở tập tin" lỗi tôi đã nhận được.

+0

Bùng nổ bạn vừa kết thúc vấn đề 2 giờ của tôi! –

+0

Giải pháp tốt nhất cho vấn đề JHead – rookieDeveloper

Các vấn đề liên quan