2012-04-23 42 views
15

Tôi có ứng dụng này đang chạy ở chế độ dọc và là một phần của một hoạt động tôi có đối tượng máy ảnh đang chạy dưới dạng một đoạn trong đó.Máy ảnh mặt trước của Android Chụp ảnh ngược

Tôi có tùy chọn để chuyển từ máy ảnh mặt trước sang mặt sau và khi chụp ảnh bằng camera sau, tất cả đều tốt và tốt.

Khi tôi chụp ảnh bằng máy ảnh mặt trước, chúng sẽ bị đảo ngược 180 độ. Bây giờ tôi biết rằng đây có thể là một cái gì đó để làm với định hướng đang ở chế độ chân dung, nhưng có nó trong cảnh quan sẽ chỉ giết ý tưởng của ứng dụng của tôi.

Có cách nào điều này có thể được khắc phục để ảnh được chụp giống với ảnh bạn thấy trong bản xem trước không?

 listener = new OrientationEventListener(this.getActivity(),SensorManager.SENSOR_DELAY_NORMAL){ 

     @Override 
     public void onOrientationChanged(int orientation) { 
      // TODO Auto-generated method stub 
      if (orientation == ORIENTATION_UNKNOWN) return; 
      android.hardware.Camera.CameraInfo info = 
        new android.hardware.Camera.CameraInfo(); 
      android.hardware.Camera.getCameraInfo(mCurrentCamera, info); 
      orientation = (orientation + 45)/90 * 90; 
      int rotation = 0; 
      if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
       rotation = (info.orientation - orientation + 360) % 360; 
      } else { // back-facing camera 
       rotation = (info.orientation + orientation) % 360; 
      } 
      if (mCamera.getParameters() != null){ 
      Camera.Parameters mParameters = mCamera.getParameters(); 

      mParameters.setRotation(rotation); 
      mCamera.setParameters(mParameters); 
      } 
     } 

    }; 
    listener.enable(); 
    if (listener.canDetectOrientation()) 
     Log.d("Orientation Possible", "Orientation Possible"); 

Vấn đề là sau khi tôi thử chụp ảnh này, sự cố này bị treo. Ngoài ra, nếu nó chạy trong một thời gian chỉ trong chế độ xem trước nó bị treo một lần nữa. Tôi cũng có lẽ nên thêm, rằng trong một phương pháp khác tôi đang làm điều này.

public void switchCamera(Camera camera) { 
    setCamera(camera); 
    try { 
     camera.setPreviewDisplay(mHolder); 
    } catch (IOException exception) { 
     Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
    } 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 

    requestLayout(); 


    try{ 
     camera.setParameters(parameters); 
    } 
    catch (RuntimeException ex){ 
     Log.d("Preview", "Failure to set proper parameters"); 
     //need to improve this method 
     if (mSupportedPreviewSizes != null) { 
      Camera.Size cs = mSupportedPreviewSizes.get(0); 
      parameters.setPreviewSize(cs.width, cs.height); 
      camera.setParameters(parameters); 
      requestLayout(); 
      //int tempheight = mPreviewSize.height; 
      //mPreviewSize.height = mPreviewSize.width; 
      //mPreviewSize.width = tempheight; 

     } 
    } 

Điều này được gọi khi bạn chuyển đổi giữa các máy ảnh (quay mặt về phía trước ngược lại). Điều này có thể gây trở ngại cho người nghe sự kiện định hướng không?

Ngoài ra, khi lưu ảnh được chụp, đây là những gì tôi gọi. Trước khi nó chỉ tham gia vào dữ liệu như một tham số, nhưng tôi đã cố gắng để làm cho nó mất định hướng màn hình là tốt. Vấn đề là định hướng màn hình luôn luôn là 90, không có vấn đề gì. Vì vậy, bitmap sẽ luôn được xoay 90 độ (rất tuyệt vời để chụp ảnh bằng camera sau) nhưng đảo ngược nó khi chụp bằng camera trước. Có thể sửa lỗi được thực hiện trong chức năng này không?

public static Bitmap MakeSquare(byte[] data, int orientation) { 
    int width; 
    int height; 
    // Rotate photo 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(orientation); 
    // Convert ByteArray to Bitmap 
    Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length); 
    width = bitPic.getWidth(); 
    height = bitPic.getHeight(); 


    // Create new Bitmap out of the old one 
    Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true); 
    bitPic.recycle(); 
    int desWidth; 
    int desHeight; 
    desWidth = bitPicFinal.getWidth(); 
    desHeight = desWidth; 
    Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight()/2 - bitPicFinal.getWidth()/2,desWidth, desHeight); 
    croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true); 
    return croppedBitmap; 
} 

Trả lời

34

Tốt. Có vẻ như tôi đã chăm sóc nó.Tôi đã sử dụng những lời khuyên từ này: Android, front and back camera Orientation , Landscape

Và thay đổi chức năng MakeSquare của tôi như thế này:

public static Bitmap MakeSquare(byte[] data, int cameraID) { 
    int width; 
    int height; 
    Matrix matrix = new Matrix(); 
    Camera.CameraInfo info = new Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraID, info); 
    // Convert ByteArray to Bitmap 
    Bitmap bitPic = BitmapFactory.decodeByteArray(data, 0, data.length); 
    width = bitPic.getWidth(); 
    height = bitPic.getHeight(); 

    // Perform matrix rotations/mirrors depending on camera that took the photo 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) 
    { 
     float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1}; 
     Matrix matrixMirrorY = new Matrix(); 
     matrixMirrorY.setValues(mirrorY); 

     matrix.postConcat(matrixMirrorY); 
    } 

    matrix.postRotate(90); 


    // Create new Bitmap out of the old one 
    Bitmap bitPicFinal = Bitmap.createBitmap(bitPic, 0, 0, width, height,matrix, true); 
    bitPic.recycle(); 
    int desWidth; 
    int desHeight; 
    desWidth = bitPicFinal.getWidth(); 
    desHeight = desWidth; 
    Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight()/2 - bitPicFinal.getWidth()/2,desWidth, desHeight); 
    croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true); 
    return croppedBitmap; 
} 

Điều này dường như làm việc và làm các trick. Mặc dù tôi không chắc đây là cách tốt nhất, nhưng tôi hài lòng với nó. Bây giờ tất cả những gì tôi phải làm là tìm ra lý do tại sao nó không lấy tỷ lệ khung hình thích hợp khi sử dụng camera phía trước.

+0

Cảm ơn người đàn ông! Bạn có bất kỳ thông tin nào về cách hoạt động của giải pháp này trên các thiết bị 'tất cả' không? – marino

+1

Giải quyết vấn đề xoay hình ảnh camera phía trước của tôi (y) –

+0

điều này là tốt nhất .. cảm ơn – tsanzol

2

Cho những liên kết này thử xem:

http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setRotation(int)

Cụ thể, đây là một đoạn nói dài giòng từ liên kết setRotation.

"Nếu ứng dụng muốn xoay ảnh để phù hợp với hướng của những gì người dùng nhìn thấy, các ứng dụng nên sử dụng OrientationEventListener và Camera.CameraInfo. Giá trị từ OrientationEventListener liên quan đến hướng tự nhiên của thiết bị. CameraInfo.orientation là góc giữa hướng máy ảnh và hướng thiết bị tự nhiên, tổng của cả hai là góc xoay cho máy ảnh mặt sau Sự khác biệt của hai là góc quay cho camera mặt trước. Lưu ý rằng ảnh JPEG của máy ảnh mặt trước không được nhân đôi như trong màn hình xem trước. "

Tôi đã sử dụng mã này nguyên trạng, chưa sửa đổi. Máy ảnh của tôi tốt hơn bây giờ, vẫn cần một số TLC. Tôi cũng chưa có chức năng hướng về phía trước.

Chúc may mắn!

+0

Cảm ơn, tôi đã có một cái nhìn vào họ một đã cố gắng để thực hiện một onOrientationChanged nghe theo cách họ khuyên nhưng tôi tiếp tục bị treo. Tôi đã chỉnh sửa bài đăng của mình để hiển thị mã của tôi – Valentin

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