2017-11-13 10 views
0

私はこの会社が嫌いです。これらのデバイスには、多くのバグがあります。 Ok質問: 私は愚かな問題を修正しようとしています(私は5年以上存在すると知っています) カメラから撮影した写真 - 90度回転しました。 私は2つのデバイスを持っている:例えばカメラから回転した写真(SAMSUNGデバイス)

Nexus 5p and Samsung j2 
    Nexus - work perfect. Everything fine. 
    Samsung - photo rotated 

:いくつかのテストの後

Photo size - Portrate: width 1900(?????) height - 1000(????) 
rotate to landscape : width 1900 height 1000 

Photo size - nexus : Portrate : width 1000, height 1900. Landscape : 
width 1900 , height 1000 

は、サムスンのデバイス上で見ることができますサムスンのデバイス上の風景モードで写真を作る場合 - すべてが大丈夫です。写真は回転しません

写真をポルテットで作成する場合 - 写真は90度回転します。 ???

String _path = Environment.getExternalStorageDirectory() 
            + File.separator + "camera_img.jpg"; 
          File file = new File(_path); 
          Uri outputFileUri = Uri.fromFile(file); 
          Intent intent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
          intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
          startActivityForResult(intent, CAMERA_REQUEST); 
:(ただし、景観上のように写真のサイズ(

誰もがこの愚かなバグを修正する方法を知っている方法)その可能かもしれない任意のは、どのようにカメラの向きを検出するイム写真をIntentActivityを使用して私に言うことができます

何か助けてもらえますか? 私はサムスンのデバイスが回転するよりもチェッカーを追加しますが、写真をポートレートモードで作成した場合にのみ回転が良いです。知っていますか?

+0

同じ問題が発生しました。次のリンクを参照してください。https://stackoverflow.com/questions/14066038/why-does-an-image-captured-using-camera-intent-gets-rotated-on-some-devices- on-a – Dhruv

+0

@DhruvPatel写真サイズが常に横長の大きさなので、動作しません。 – Peter

+0

風景や肖像画ファイルをインターネットのどこかに置いて見せることができますか? – greenapps

答えて

2

私が解決する方法が見つかりました:だけでなく非常に難しいその本当に愚かなと私

のために最初のステップでアクティビティの結果を取得する

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) { 

      String _path = Environment.getExternalStorageDirectory() + File.separator + "TakenFromCamera.jpg"; 
      String p1 = Environment.getExternalStorageDirectory().toString(); 
      String fName = "/TakenFromCamera.jpg"; 
      final int rotation = getImageOrientation(_path); 
      File file = resaveBitmap(p1, fName, rotation); 
      Bitmap mBitmap = BitmapFactory.decodeFile(_path); 

main stesps its:getImageファイルの変更前のオリエンテーション。

1)getImageOrientation(パスで)
2)ファイルを保存し直し(プレビューのためにのみ必要な場合は、私たちは、このステップをスキップすることができ、サーバーに送信する必要がある場合)
3)のファイル

から正しいビットマップを取得ステップ1と3だけを十分にプレビューし、この関数を使用します。ビットマップを回転させます。

private Bitmap checkRotationFromCamera(Bitmap bitmap, String pathToFile, int rotate) { 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(rotate); 
     Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
     return rotatedBitmap; 
    } 

getImageOrientation

public static int getImageOrientation(String imagePath) { 
    int rotate = 0; 
    try { 
     ExifInterface exif = new ExifInterface(imagePath); 
     int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
     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; 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return rotate; 
} 

とresaveBitmapあなたが画像を回転させたい場合は必要

private File resaveBitmap(String path, String filename, int rotation) { //help for fix landscape photos 
     String extStorageDirectory = path; 
     OutputStream outStream = null; 
     File file = new File(filename); 
     if (file.exists()) { 
      file.delete(); 
      file = new File(extStorageDirectory, filename); 
     } 
     try { 
      // make a new bitmap from your file 
      Bitmap bitmap = BitmapFactory.decodeFile(path + filename); 
      bitmap = checkRotationFromCamera(bitmap, path + filename, rotation); 
      bitmap = Bitmap.createScaledBitmap(bitmap, (int) ((float) bitmap.getWidth() * 0.3f), (int) ((float) bitmap.getHeight() * 0.3f), false); 
      bitmap = Utils.getCircleImage(bitmap); 
      outStream = new FileOutputStream(path + filename); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 
      outStream.flush(); 
      outStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return file; 
    } 

thatsのすべて:)とすべてがうまく

0

あなたはカメラAPIで自分で写真を撮っていますか? ので、あなたが方向性を得ることができる場合: カメラ1のAPI:

CameraInfo cameraInfo = new CameraInfo(); 
int sensorOrientation = cameraInfo.orientation; 

カメラ2のAPI:

CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); 
CameraCharacteristics characteristics = mCameraCharacteristics; 
int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); 
+0

私の記事を丁寧に読んでください、私はそこに書き込みます:imはintentActivityを使用していませんCamera Api。 – Peter

+0

申し訳ありませんが、私の悪い、EXIFを使用して画像の回転を確認してください –

0

を動作しますが、あなたが唯一持っている場合これを使用することができます:

private byte[] rotationFromCamera(byte[] data) { 
    int rotation = Exif.getOrientation(data); 
    if(rotation == 0) return data; 
    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, null); 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(rotation); 
    Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    rotatedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    return stream.toByteArray(); 
} 

このEXIF utilのこのanswer

から画像が大きい場合、これは少し遅いです。

関連する問題