2016-05-08 7 views
2

カメラ機能を使用するAndroidアプリケーションを作成しています。私が抱えている問題は、フロントのカメラから取得した画像データ(バイト[])が、samsung s7とnexusの電話機に逆さまになっていることです。プレビューでは正しいように見えますが、データをそのまま保存してギャラリーに表示すると、上下逆に表示されます。私は保存する前に画像データを反転することができますが、4.4(kitkat)を実行しているブルーC 5.0 HDでコードをテストし、その電話機の画像データが適切な方向に向けられています。画像を反転すると、他のデバイスでエラーが発生します。私は、新しいサムスンとネクサスの携帯電話が建てられたときに、正面を向いているカメラが逆さになって部屋を救うために問題があると言われています。私はこれが正しいかどうかは分かりませんが、もしそうなら、私はすべての画像を反転すると、カメラの向きが正しい電話機が壊れてしまいます。画像を保存する前に画像データの向きを検出する方法はありますか?ここで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サンプルからのものであり、ネクサス5倍に正しく動作します。(上下逆にカメラで)その後

だけ camera.setDisplayOrientation(displayOrientation); を呼び出し、それが正しく画像を保存します。

+0

このコードは、電話機全体が回転しているかどうかを検出しています。私の問題は、前向きのカメラで画像データが正常なアップリュート画像を撮った場合、画像が上下逆さまに戻ってくるということです。私はsamsung s7エッジとnexus 5を持っています。どちらもその問題を抱えています。私はまた、ブルC 5.0 HD 4.4(kitkat)を実行していると、その携帯電話の画像データは、正しい方法の方向に来る。 – Brennan

+0

このコードは、電話機の回転に基づいてカメラ画像の適切な回転を設定しています。カメラの上下位置を補正します。あなたはそれを試しましたか?はい、それがうまくいかない場合 - ok ...そうでない場合 - あなたのコメントは奇妙に見えます。必要な場合は、カメラオリエンテーション自体が 'cameraInfo.orientation'フィールドにあります。 – Raiv

+0

申し訳ありませんが、私はあなたの解決策を試してみましたが、それは修正されませんでした。 – Brennan

関連する問題