Андроидная передняя и задняя камера сняли проблему ориентации изображения, вращаются неправильно

У меня есть приложение для камеры в портретном режиме, которое снимает изображения с фронтальных и задних камер. Проблема в том, что захваченные изображения вращаются неправильно …

Для предварительного просмотра я использовал следующий код ….

Camera.Parameters parameters = camera.getParameters(); android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(defaultCameraId, info); int rotation = this.getWindowManager().getDefaultDisplay() .getRotation(); if (Integer.parseInt(Build.VERSION.SDK) >= 8) { 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; } camera.setDisplayOrientation(result); } else { parameters.set("orientation", "portrait"); } camera.setParameters(parameters); 

Но захваченные изображения вращаются неправильным образом. Я также попытался повернуть захваченное изображение, используя matrix.postRotate(bitmap) Это тоже не работает в некоторых устройствах, таких как nexus .. Я тоже пытался EXIF. Но здесь у меня есть Url вместо filepath.That не работает. Может кто-нибудь мне помочь ?

Solutions Collecting From Web of "Андроидная передняя и задняя камера сняли проблему ориентации изображения, вращаются неправильно"

Вы можете ссылаться ниже кода.

 ExifInterface exif = new ExifInterface(SourceFileName); //Since API Level 5 String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

А также ссылайтесь на эту ссылку https://stackoverflow.com/a/6124375/1441666

Для этого я использую следующий код:

 ExifInterface exif = new ExifInterface(getUriPath(uri)); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

getUriPath:

 public String getUriPath(Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(projection[0]); cursor.moveToFirst(); String filePath = cursor.getString(column_index); cursor.close(); return filePath; } else return null; } 

Вы можете использовать это, чтобы получить ориентацию от Uri

  String filePath = mImageUri.getPath(); if (filePath != null) { rotation = -1; ExifInterface exif = new ExifInterface(filePath); // Since // API // Level // 5 rotation = Integer.parseInt(exif.getAttribute(ExifInterface.TAG_ORIENTATION)); // //Log.v("roation", // exif.getAttribute(ExifInterface.TAG_ORIENTATION)); } } } catch (Exception e) { Toast.makeText(getApplicationContext(), "Internal error", Toast.LENGTH_LONG).show(); Log.e(e.getClass().getName(), e.getMessage(), e); } 

А так как поворот ноты 3 = 180, 6 = 90, 8 = 270 '

Попробуйте этот фрагмент кода

 try { ExifInterface exif = new ExifInterface(filePath); orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); //Toast.makeText(getApplicationContext(), ""+orientation, 1).show(); Log.v("log", "ort is "+orientation); } catch (IOException e) { e.printStackTrace(); } 

А затем поверните матрицу в соответствии с ориентацией, которую вы получаете

 if (orientation==6) { Matrix matrix = new Matrix(); matrix.postRotate(90); bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); } else if (orientation==8) { Matrix matrix = new Matrix(); matrix.postRotate(270); bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); } else if (orientation==3) { Matrix matrix = new Matrix(); matrix.postRotate(180); bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true; } 

Выбранный ответ просто дает возможное вращение, которое может быть сохранено в заголовке EXIF. В некоторых случаях камера не устанавливает атрибут «ExifInterface.TAG_ORIENTATION» в EXIFHeader, поэтому будет 0 (ExifInterface.ORIENTATION_UNDEFINED). И событие, если оно установлено, оно будет истинным только в одном случае / ориентации при съемке. Вам необходимо вручную установить поворот в параметрах камеры с помощью метода setRotation (). Документация setRotation () очень понятна, а также объясняет, как рассчитать вращение с учетом поворота устройства и ориентации датчика камеры (как правило, ландшафта).

Поэтому проверьте метод setRotation (). Вот что вам нужно изменить.