2016-05-08 116 views
2

我正在構建一個使用攝像頭功能的android應用程序。我遇到的問題是我從前置攝像頭獲得的圖像數據(字節[])在我的三星s7和nexus手機上倒過來。它在預覽中看起來是正確的,但是在將數據保存爲原樣然後在圖庫中顯示圖像之後,它們都是顛倒的。我知道我可以在保存前翻轉圖像數據,但我已經在運行4.4(kitkat)的藍光C 5.0 HD上測試了該代碼,並且該手機上的圖像數據以正確的方式進行了定向。所以alwyas翻轉圖像會導致其他設備上的錯誤。我被告知這個問題是因爲當建立新的三星和nexus手機時,前置攝像頭被顛倒過來以節省空間。我不確定這是否正確,但如果是這樣,如果我翻轉所有圖像,它將弄亂具有正確相機方向的手機。那麼有沒有辦法在保存圖像之前檢測圖像數據的方向?Android前置攝像頭圖像被倒置保存

這裏是我使用的代碼:

mCamera.takePicture(null, null, mPicture); 

回調:

private final Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 

     processCameraCallback(data); 
    } 
}; 

處理數據:

public void processCameraCallback(byte[] data) { 
    confirmPhoto(true); 
    //Make a new empty picture file 
    try { 
     pictureFile = Utils.createImageFile(); 
    } catch (IOException ex) { 
     // Error occurred while creating the File 
     Log.e(TAG, "Failed to create photo file: " + ex.toString()); 
     confirmPhoto(false); 
     return; 
    } 

    //Write the file to the storage 
    try { 
     FileOutputStream fos; 
     if (pictureFile != null) { 

      fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
     } 
    } catch (FileNotFoundException e) { 
     Log.d(TAG, "File not found: " + e.getMessage()); 
     confirmPhoto(false); 
     return; 
    } catch (IOException e) { 
     Log.d(TAG, "Error accessing file: " + e.getMessage()); 
     confirmPhoto(false); 
     return; 
    } 
} 
+0

你有沒有想過這個?我使用本機相機應用程序遇到了與S7相同的問題,並補償了EXIF數據中返回的方向。 –

回答

2

使用此代碼來調整攝像頭的方向:

private int detectCameraDisplayOrientation(Activity activity, 
              Camera.CameraInfo info) { 

    int rotation = activity.getWindowManager().getDefaultDisplay() 
      .getRotation(); 
    int degrees = 0; 
    switch (rotation) { 
     case Surface.ROTATION_0: degrees = 0; break; 
     case Surface.ROTATION_90: degrees = 90; break; 
     case Surface.ROTATION_180: degrees = 180; break; 
     case Surface.ROTATION_270: degrees = 270; break; 
    } 

    int result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    return result; 
} 

這是從照相機API樣品和正確適用於Nexus 5X保護。(有倒掛相機)後

就叫 camera.setDisplayOrientation(displayOrientation); ,它會正確保存圖片。

+0

代碼正在檢測整個手機是否旋轉。我的問題是,如果我用前置攝像頭拍攝正常的圖像數據,圖像數據會隨着圖像上下顛倒。我有三星s7邊緣和nexus 5,都有這個問題。我也有一個運行4.4(kitkat)的藍光C 5.0 HD,手機上的圖像數據以正確的方式定向。 – Brennan

+0

此代碼正在根據手機旋轉設置相機圖像的正確旋轉。補償照相機顛倒的位置。你試過了嗎?如果是的話,它不起作用 - 好的...如果不是 - 你的評論似乎很奇怪。如果您只需要它,相機方向本身位於'cameraInfo.orientation'字段中。 – Raiv

+0

對不起,我試過你的解決方案,但沒有解決它。 – Brennan