我正在尝试使用前置摄像头(自拍照)和后置摄像头获取图片并将其保存到imageview。当我尝试使用前置摄像头(自拍照)拍摄照片时,图像会上下颠倒(垂直),而当使用后置摄像头时,图像会水平翻转。
我正在尝试使用“ camInfo.face ==(Camera.CameraInfo.CAMERA_FACING_FRONT”和“ camInfo.face ==(Camera.CameraInfo.CAMERA_FACING_BACK”)来检测摄像机的使用情况,但仅使用“ camInfo.face ==(Camera .CameraInfo.CAMERA_FACING_BACK”正在工作。我希望可以稍作调整以使其正常工作。
不知道如何进行。帮助非常可观。
compileSdkVersion 28
defaultConfig {
applicationId "com.austurn.keikonew.keiko"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
try {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Uri uri = photoURI;
Bitmap myImg = BitmapFactory.decodeFile(photoFile.getAbsolutePath());
Matrix matrix = new Matrix();
int width = myImg.getWidth();
int height=myImg.getHeight();
Camera cam = null;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
Camera.CameraInfo camInfo = new Camera.CameraInfo();
if (camInfo.facing ==(Camera.CameraInfo.CAMERA_FACING_FRONT)) {
matrix.postRotate(90);
Toast.makeText(this.getActivity(), "Front camera", Toast.LENGTH_LONG).show();
}
if (camInfo.facing ==(Camera.CameraInfo.CAMERA_FACING_BACK)) {
Toast.makeText(this.getActivity(), "back camera", Toast.LENGTH_LONG).show();
float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1};
Matrix matrixMirrorY = new Matrix();
matrixMirrorY.setValues(mirrorY);
matrix.postConcat(matrixMirrorY);
matrix.postRotate(270);
}
Bitmap bitPicFinal = Bitmap.createBitmap(myImg, 0, 0, width, height,matrix, true);
myImg.recycle();
int desWidth;
int desHeight;
desWidth = bitPicFinal.getWidth();
desHeight = desWidth;
Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight);
croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true);
camview.setImageBitmap(croppedBitmap);
}
}catch(Exception e){
Toast.makeText("Something went wrong", Toast.LENGTH_LONG).show();
}
}
}
答案 0 :(得分:0)
您正在创建Camera.CameraInfo的新实例,该实例实际上并不引用用于捕获照片的相机。 您应该使用捕获文件中包含的exif元数据,请尝试此处描述的解决方案:
Why does an image captured using camera intent gets rotated on some devices on Android?
答案 1 :(得分:0)
Camera.CameraInfo()
默认构造函数没有说明您使用的实际设备。应该使用Camera#getCameraInfo()静态方法填充此对象。然后,您将知道索引1处的摄像头设备是面向后还是面向前,并且还具有该设备的 hardware 方向,这可以帮助通过Camera API调整此摄像头拍摄的图像。
此方向信息与通过ACTION_IMAGE_CAPTURE意向接收的图像无关,因为“相机”应用可能会选择旋转或不旋转Jpeg,然后再将其存储到MediaStore。
在大多数设备上,存储的图像的EXIF会带有前置或后置摄像头的指示,但是有no officially documented way可以确定。
请注意,EXIF方向"0"
并不表示“人像”,它表示Jpeg以自然方式存储,并且无需调整方向即可显示。如果您获得的图像的方向是"0"
,且宽度<高度,则为纵向;如果您获得的图像的方向为"0"
,且宽度>高度,则为横向。