2012-07-26 35 views
13

Tôi đã viết hoạt động máy ảnh tùy chỉnh để xử lý một số sự cố mà tôi gặp phải với một số thiết bị Android nhất định khi gọi chụp ảnh ý định. Người dùng có thể chọn lưu hình ảnh hoặc chỉ sử dụng dữ liệu được trả lại từ OnPictureTakenCallback.Vấn đề định hướng hình ảnh Android với hoạt động máy ảnh tùy chỉnh

Sự cố tôi đang gặp đang hiển thị chính xác hình ảnh theo hướng được chụp. Tôi buộc các hoạt động được hiển thị trong bức chân dung bằng cách gọi SetRequestedOrientation.

Làm thế nào tôi biết được Máy ảnh định hướng chính xác khi người dùng chụp ảnh? tức là người dùng có thể chụp ảnh ở chế độ xoay 90 (dọc).

Tôi đã cố gắng sử dụng getRotation() trên màn hình mặc định của trình quản lý cửa sổ nhưng phải đặt hướng được yêu cầu thành dọc mà chỉ trả về Surface.ROTATION_0.

Cập nhật: Để làm rõ vấn đề khác của tôi, làm cách nào tôi có thể xác định hướng từ chỉ byte[] dữ liệu trong gọi lại hình ảnh nếu người dùng không lưu hình ảnh?

Cập nhật: Sau khi thử các câu trả lời bên dưới với mã này, tất cả những gì tôi nhận được là ExifInterface.ORIENTATION_NORMAL. Tôi cũng đã thay đổi mã của mình để chỉ lưu tệp được trả về từ máy ảnh vì tôi không chắc có một cách dễ dàng để xác định hướng với chỉ có dữ liệu byte[].

private PictureCallback mPicture = new PictureCallback() 
    { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 
      File directory = new File(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES), 
        "MyApp"); 
      if(!directory.exists()) 
      { 
       if(!directory.mkdirs()) 
       { 
        Log.d("CAMERA", "Unable to create directory to save photos."); 
        return; 
       } 
      } 
      File file = new File(directory.getPath() + file.separator + "IMG_" + SimpleDateFormat.getDateTimeInstance().toString() + ".jpg"); 
      FileOutputStream fos = new FileOutputStream(file); 
      fos.write(data); 
      fos.close(); 
      ExifInterface exif = new ExifInterface(file.getCanonicalPath()); 
      int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
      int rotate = 0; 

      switch (orientation) 
      { 
       case ExifInterface.ORIENTATION_ROTATE_90: 
        rotate = 90; 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_180: 
        rotate = 180; 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_270: 
        rotate = 270; 
        break; 
       case default: 
        break; 
      } 
     } 
    }; 
+0

có thể bất kỳ một sự giúp đỡ http://stackoverflow.com/questions/28379130/how -to-set-camera-image-orientation –

Trả lời

15

Vì vậy, bạn đang gặp phải một số vấn đề với hướng của máy ảnh.

Liên kết này cho thấy một ứng dụng ví dụ về một hoạt động chụp ảnh đơn giản: http://labs.makemachine.net/2010/03/simple-android-photo-capture/

Có lẽ bạn nên thử sửa chữa các định hướng bằng cách làm một cái gì đó như thế này:

  ExifInterface exif = new ExifInterface(_path); 
      int exifOrientation = exif.getAttributeInt(
      ExifInterface.TAG_ORIENTATION, 
      ExifInterface.ORIENTATION_NORMAL); 

      int rotate = 0; 

      switch (exifOrientation) { 
      case ExifInterface.ORIENTATION_ROTATE_90: 
      rotate = 90; 
      break; 

     case ExifInterface.ORIENTATION_ROTATE_180: 
     rotate = 180; 
     break; 

     case ExifInterface.ORIENTATION_ROTATE_270: 
     rotate = 270; 
     break; 
     } 

      if (rotate != 0) { 
      int w = bitmap.getWidth(); 
      int h = bitmap.getHeight(); 

// Setting pre rotate 
      Matrix mtx = new Matrix(); 
      mtx.preRotate(rotate); 

     // Rotating Bitmap & convert to ARGB_8888, required by tess 
     bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false); 
     bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 
     } 
+0

dường như hoạt động đối với tôi .. lại xuất hiện: http://labs.makemachine.net/2010/03/simple-android-photo-capture/ – Android2390

+0

Tôi đã cập nhật câu hỏi của mình để trả lời câu trả lời của bạn. – Bryan

+1

Tôi đã sử dụng mã này để xoay hình ảnh trong phương pháp picturecalback nhưng một số cách nó không hoạt động, bạn có thể giúp tôi tôi sẽ bỏ phiếu cho bạn để được giúp đỡ – Nitin

4

Bạn sẽ cần phải đọc Siêu dữ liệu từ JPEG gốc để xác minh hướng mà ảnh được chụp.

ExifInterface exif = new ExifInterface(SourceFileName); 
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

Nguồn: How to determine orientation of picture without ExifInterface?

Edit: Trả lời chỉnh sửa của bạn, bạn đã cố gắng sử dụng các phương pháp getCameraInfo() đó là có sẵn với các đối tượng máy ảnh thông qua năm gọi lại? Nó có thông tin bạn yêu cầu không?

Nguồn: http://developer.android.com/reference/android/hardware/Camera.html

+0

Bạn sẽ có thể gọi "định hướng" trên CameraInfo. http://developer.android.com/reference/android/hardware/Camera.CameraInfo.html – bsempe

+0

Theo tài liệu, điều này có sẵn từ cấp API 9, tức là Android 2.3. Ứng dụng của tôi là cấp API tối thiểu 8. – Bryan

3

Loại bỏ các setRequestedOrientation() phép getWindowManager().getDefaultDisplay().getRotation() để cung cấp cho xoay đúng. Tôi đoán việc đặt định hướng được yêu cầu ngăn hoạt động tự vẽ lại khi thay đổi cấu hình do đó thiết bị không biết bất kỳ loại xoay nào đã thay đổi. Vấn đề duy nhất của tôi bây giờ là chuyển đổi từ chế độ nằm ngang ở 0 độ định hướng đến chế độ phong cảnh 180 độ xoay không cháy này:

@Override 
public void onConfigurationChanged(Configuration newconfig) 
{ 
    super.onConfigurationChanged(newconfig); 

} 
3
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mCamera.setPreviewDisplay(holder); 
     Camera.Parameters parameters = mCamera.getParameters(); 
     if (this.getResources().getConfiguration().orientation != 
       Configuration.ORIENTATION_LANDSCAPE) 
     { 
      parameters.set("orientation", "portrait"); <----THis gets the job done!!! 
      // For Android Version 2.2 and above 
      mCamera.setDisplayOrientation(90); 
      // For Android Version 2.0 and above 
      parameters.setRotation(90); 
     } 


     // End Effects for Android Version 2.0 and higher 
     mCamera.setParameters(parameters); 
    } 
    catch (IOException exception) 
    { 
     mCamera.release(); 
    } 

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