相机预览方向问题

对于相机的预览方向我们可以通过如下API进行设置

camera.setDisplayOrientation(0);但是,该API影响的是相机的预览方向,对于照片的保存方向并没有什么影响,最终照片保存的方向还是由Camera的图像Sensor决定的。

照片保存方向问题

第一种解决办法就是对拍照后的图片先进行旋转再进行保存,如下

public static Bitmap rotateBitmapByDegree(Bitmap bmp, int degree) {

if (degree == 0 || null == bmp) return bmp;

Bitmap returnBm = null;

// 根据旋转角度,生成旋转矩阵

Matrix matrix = new Matrix();

matrix.postRotate(degree);

// 将原始图片按照旋转矩阵进行旋转,并得到新的图片

returnBm = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);

if (returnBm == null) {

returnBm = bmp;

}

if (returnBm != bmp && !bmp.isRecycled()) {

bmp.recycle();

bmp = null;

}

return returnBm;

}但是这种方法比较耗时,尤其图片较大的时候,不建议使用。

第二种方法就是通过ExifInterface对图片进行旋转,如下

public static void setPictureDegreeZero(String path) {

try {

ExifInterface exifInterface = new ExifInterface(path);

// 修正图片的旋转角度,设置其不旋转。这里也可以设置其旋转的角度,可以传值过去,

// 例如旋转90度,传值ExifInterface.ORIENTATION_ROTATE_90,需要将这个值转换为String类型的

exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(ExifInterface.ORIENTATION_ROTATE_90))

exifInterface.saveAttributes();

} catch (IOException e) {

e.printStackTrace();

}

}这种方法一定要在保存完图片之后再使用,否则不会生效。最终的效果就是你拍照的时候什么方向,保存到本地的照片就是什么方向。

第三种方法就是通过OrientationEventListener实现对图片保存方向的纠正,如下

public class IOrientationEventListener extends OrientationEventListener {

public IOrientationEventListener(Context context) {

super(context);

}

@Override

public void onOrientationChanged(int orientation) {

if (ORIENTATION_UNKNOWN == orientation) {

return;

}

Camera.CameraInfo info = new Camera.CameraInfo();

Camera.getCameraInfo(mCameraId, info);

orientation = (orientation + 45) / 90 * 90;

int rotation = 0;

if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {

rotation = (info.orientation - orientation + 360) % 360;

} else {

rotation = (info.orientation + orientation) % 360;

}

Log.e("TAG","orientation: " + orientation);

if (null != mCamera) {

Camera.Parameters parameters = mCamera.getParameters();

parameters.setRotation(rotation);

mCamera.setParameters(parameters);

}

}

}

备注:后置摄像头cameraId=0;

final IOrientationEventListener orientationEventListener = new IOrientationEventListener(this);

surfaceView.getHolder().setKeepScreenOn(true);//屏幕常亮

surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {

//当SurfaceHolder被创建的时候回调

@Override

public void surfaceCreated(SurfaceHolder surfaceHolder) {

orientationEventListener.enable();

......

}

//当SurfaceHolder的尺寸发生变化的时候被回调

@Override

public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

......

}

//当SurfaceHolder被销毁的时候回调

@Override

public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

orientationEventListener.disable();

......

}

});这种方法最终的效果就是不管你拍照的时候是什么方向,最终保存到本地的照片都是0度方向的,跟系统相机拍照后一个效果。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐