Intereting Posts
RecyclerView прокручивал прослушиватель UP / DOWN Как исправить IncompatibleClassChangeError во время Android Jackson Parsing, используя аннотации в Android Lollipop? Как заблокировать ориентацию во время выполнения W / OpenGLRenderer: неверно называется buildLayer on View: ImageButton, разрушающий слой Округление на половину с десятичным форматом в Android Android Google Maps Android Maven Plugin – идентификатор ресурса не найден для атрибута cameraTargetLat Невозможно включить файлы заголовков STL с Android NDK r5 Изменение цвета фона неопределенного горизонтального хода Как добавить элемент в верхний ActionBar? Как Android Studio инициирует сборщик мусора и как он работает? Жест MultiSelect, такой как приложение Google Фото. Как запустить мобильное приложение из приложения для ношения? Удаление флага краски в Android NotSerializableException при сохранении состояния фрагмента Сколько времени требуется, чтобы сообщение из Google Cloud Messaging поступило на устройство

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

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

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

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 не работает. Может кто-нибудь мне помочь ?

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

     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 (). Вот что вам нужно изменить.