android正面和背面照相机捕获的图片方向问题,旋转方式错误

我有一个肖像模式的相机应用程序,从前端和后端摄像头拍照。问题就像捕获的图像旋转错误的方式… …

预览我已经使用下面的代码….

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而不是文件path。那不行。 谁能帮我 ?

Solutions Collecting From Web of "android正面和背面照相机捕获的图片方向问题,旋转方式错误"

你可以参考下面的代码。

 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(); } 

然后按照您获取的方向旋转matrix

 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标题中的可能的旋转。 在几种情况下,相机不会在EXIFHeader中设置“ExifInterface.TAG_ORIENTATION”属性,因此它将为0(ExifInterface.ORIENTATION_UNDEFINED)。 如果设置了事件,则只有在拍摄照片时的一种情况/方向上才是真实的。 您必须使用setRotation()方法手动设置相机参数中的旋转angular度。 setRotation()的文档非常清晰,并解释了如何考虑设备旋转和相机传感器方向(通常是风景)来计算旋转。

所以请查看setRotation()方法。 那是你需要改变的。