没有surfaceView的Android相机图像方向

时间:2014-04-07 09:03:52

标签: android android-camera android-orientation

我有一项服务,我必须在没有surfaceView的情况下捕获图像,除了结果图像方向外,一切都很完美,我发现它是错误的。在像HTC这样的小型设备上,我发现它有问题或旋转,所以手动设置旋转以使其工作并且有效。

if (camInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
    parameters.setRotation(270);
 } else if (camInfo.facing ==
    Camera.CameraInfo.CAMERA_FACING_BACK) {
    parameters.setRotation(90);
 }

但是当检查三星和HTC(大型设备)时,它会产生角度问题。我发现了一些帖子,我必须放置图像路径,然后尝试设置旋转,但这对我没有用,即这是因为我没有使用serfaceview拍照,然后立即将其发布到服务器。我也尝试了setCameraOrientation()的google部分代码,但它需要活动视图才能工作,所以我也失败了。

我需要的是在发送到服务器之前修复图像的角度,而不需要任何表面视图或活动。

3 个答案:

答案 0 :(得分:0)

setRotation()可能只选择使用EXIF标记。结果是图像仍然旋转90°,但带有描述正确方向的“标记”。并非所有观看者都正确地考虑了这个标志。具体来说,BitmapFactory忽略它。您可以绘制在画布上旋转的位图,或者旋转从BitmapFactory.decodeFile()获取的位图,或者在使用3 rd 方lib将其写入outStream之前操纵JPEG数据,例如: MediaUtil。 Android端口位于GitHub

答案 1 :(得分:0)

您可以通过ExifInterface对象访问图像方向信息。它会根据手机以及在横向或纵向模式下拍摄图像而为您提供不同的值。然后,您可以使用矩阵根据ExifInterface信息旋转图像。最后将其发送到您的服务器。

了解图像的路径(imagePath),请使用以下代码:

Matrix matrix = new Matrix();   
try{            
ExifInterface exif = new ExifInterface(imagePath);
                int orientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_NORMAL);

                switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    // Change the image orientation
                    matrix.postRotate(90);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    // Change the image orientation
                    matrix.postRotate(180);
                    break;
}catch (IOException e) {
                e.printStackTrace();
            }

然后使用矩阵对象来旋转位图:

  rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(),matrix, true);

在将位图发送到服务器之前,您必须将位图保存在某处(外部或内部临时存储)。

希望它对你有所帮助。

答案 2 :(得分:0)

你的旋转设置代码有点过于简单,因此在某些设备上它可能会做错误的事情。不保证这些是正确的旋转 - 正确答案取决于您的设备的当前方向以及设备上传感器的方向。

查看Camera.Parameters.setRotation的示例代码:

public void onOrientationChanged(int orientation) {
  if (orientation == ORIENTATION_UNKNOWN) return;
  android.hardware.Camera.CameraInfo info =
        new android.hardware.Camera.CameraInfo();
  android.hardware.Camera.getCameraInfo(cameraId, info);
  orientation = (orientation + 45) / 90 * 90;
  int rotation = 0;
  if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
     rotation = (info.orientation - orientation + 360) % 360;
  } else {  // back-facing camera
     rotation = (info.orientation + orientation) % 360;
  }
  mParameters.setRotation(rotation);
}

如果您没有活动,则必须弄清楚如何以其他方式获取设备的当前导向,但您需要包含info.orientation你的计算。