2012-06-14 42 views
8

Tôi đang mở ứng dụng máy ảnh khi nhấp vào nút. Và hiển thị ảnh đã chụp trong hoạt động tiếp theo. Nhưng bức ảnh chụp được quay 90 độ. Khi tôi hiển thị hình ảnh trong một chế độ xem sau khi chụp, hướng của nó luôn luôn nằm ngang. Tại sao ảnh không được hiển thị theo chiều dọc như khi ảnh được chụp ở chế độ dọc?Hướng chụp ảnh được chụp đang thay đổi trong android

onClick của nút:

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(APP_DIR+"/latest.png")));  
startActivityForResult(i, CAPTURE_PHOTO_CONSTANT); 

Bên onActvityresult:

bmp = BitmapFactory.decodeFile(APP_DIR+"/latest.png"); 
startActivity(new Intent(this, DisplayActivity.class)); 

Hiển thị bắt ảnh:

photoViewRelativeLayout.setBackgroundDrawable(new BitmapDrawable(getResources(), CaptureActivity.bmp)); 
+3

có thể trùng lặp [lý do hình ảnh được chụp bằng mục đích máy ảnh được xoay trên một số thiết bị trong Android] (http://stackoverflow.com/questions/14066038/why-image-captured-using-camera -intent-be-rotated-on-some-devices-in-android) – bummi

+0

Trả lời ở đây http://stackoverflow.com/questions/14066038/why-image-captured-using-camera-intent-gets-rotated-on- một số thiết bị-trong-android –

Trả lời

15

tôi đã cùng một vấn đề chủ yếu là với các điện thoại Samsung handsets.Apparently Samsung thiết lập các thẻ định hướng EXIF, chứ không phải là quay pixels.Reading cá nhân Bitmap bằng cách sử dụng BitmapFactory không hỗ trợ thẻ này.Những gì tôi tìm thấy giải pháp cho vấn đề này đã được sử dụng ExifInterface trong phương pháp onActivityResult của activity.Which kiểm tra định hướng liên kết với URI của hình ảnh được chụp từ máy ảnh.

     int rotate = 0; 
         try { 
          getContentResolver().notifyChange(imageUri, null); 
          File imageFile = new File(imagePath); 
          ExifInterface exif = new ExifInterface(
            imageFile.getAbsolutePath()); 
          int orientation = exif.getAttributeInt(
            ExifInterface.TAG_ORIENTATION, 
            ExifInterface.ORIENTATION_NORMAL); 

          switch (orientation) { 
          case ExifInterface.ORIENTATION_ROTATE_270: 
           rotate = 270; 
           break; 
          case ExifInterface.ORIENTATION_ROTATE_180: 
           rotate = 180; 
           break; 
          case ExifInterface.ORIENTATION_ROTATE_90: 
           rotate = 90; 
           break; 
          } 
          Log.v(Common.TAG, "Exif orientation: " + orientation); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 

         /****** Image rotation ****/ 
         Matrix matrix = new Matrix(); 
         matrix.postRotate(orientation); 
         Bitmap cropped = Bitmap.createBitmap(scaled, x, y, width, height, matrix, true); 
+0

Tôi có cần xoay bitmap ở cuối không? – Santhosh

+1

bạn cần xoay bitmap ở cuối. –

+0

Cảm ơn. Nó hoạt động. Nhưng tôi có một chút nghi ngờ. Chúng tôi đang xoay hình ảnh sau khi chụp. Liệu nó xoay ảnh được chụp ở các thiết bị khác ngoài thiết bị samsung? Điều gì xảy ra nếu ảnh được chụp đúng cách trong thiết bị XXXX? – Santhosh

0

bạn có thể chỉ simpaly xoay nó

nhận được orietation của hình ảnh chụp bằng mã này trong onActvityresult ....

File imageFile = new File(imageUri.toString()); 
     ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath()); 
     int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
     int rotate = 0; 
     switch(orientation) { 
     case ORIENTATION_ROTATE_270: 
      rotate-=90;break; 
     case ORIENTATION_ROTATE_180: 
      rotate-=90;break 
     case ORIENTATION_ROTATE_90: 
      rotate-=90;break 
     } 
+0

Giá trị của ORIENTATION_ROTATE_270, ORIENTATION_ROTATE_180 và ORIENTATION_ROTATE_90 như tôi nhận được không thể giải quyết lỗi biểu tượng cho tất cả chúng là gì. – NarendraJi

1

Tôi nhận được phần nào hoạt động. Khi tôi chụp ảnh ở chế độ Phong cảnh, mọi thứ hoạt động tốt như trước đây. Nếu tôi chụp ảnh ở chế độ dọc, tôi cần lật máy ảnh lộn ngược và ảnh có vẻ tốt. Nếu bạn nhận thấy tôi đã thay đổi mã của bạn một chút bằng cách thêm "ExifInterface" vào trước mỗi hướng. Tôi đã sử dụng mã sau:

try { 
     ExifInterface exif = new ExifInterface(filename); 
     int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
          ExifInterface.ORIENTATION_NORMAL); 
     int rotate = 0; 
     switch(orientation) { 
      case ExifInterface.ORIENTATION_ROTATE_270: 
       rotate-=90;break; 
      case ExifInterface.ORIENTATION_ROTATE_180: 
       rotate-=90;break; 
      case ExifInterface.ORIENTATION_ROTATE_90: 
       rotate-=90;break; 
      } 
       Log.d("Fragment", "EXIF info for file " + filename + ": " + rotate); 
     } catch (IOException e) { 
      Log.d("Fragment", "Could not get EXIF info for file " + filename + ": " + e); 
     } 
0

Vui lòng sử dụng Glide thay thế. Nó sửa chữa định hướng chính nó và không phân biệt điện thoại di động bạn đang sử dụng. Ở đây \ sa mẫu

Glide.with(_c).load(horizontalList.get(position).imagePath).into(holder.img_injury); 
Các vấn đề liên quan