我在我的应用程序中使用相机拍摄图像,当切换到前置摄像头时,图像是镜像。我用这段代码拍照(旋转并补偿镜子) 使用此代码后置摄像头正常(没有镜像和旋转)! 但前置摄像头的结果与此相似:
此方法获取前置摄像头ID: (我使用CameraInfo获取前置摄像头ID并将id发送到结果活动)
public int getFrontFacingCameraId() {
int numCameras = getNumberOfCameras();
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for (int cameraId = 0; cameraId < numCameras; cameraId++) {
Camera.getCameraInfo(cameraId, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
return cameraId;
}
}
return 0;
}
这个轮换代码:(使用矩阵)
private Bitmap rotateImage(Bitmap source, float angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
return source;
}
}
此代码用于活动结果:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PICTURE_RESULT:
if (resultCode == Activity.RESULT_OK) {
try {
Bitmap thumbnail = MediaStore.Images.Media.getBitmap(getContentResolver(), IMG_URI);
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
int rotation = this.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 90;
break;
case Surface.ROTATION_90:
degrees = 180;
break;
case Surface.ROTATION_180:
degrees = 270;
break;
case Surface.ROTATION_270:
degrees = 360;
break;
}
int displayOrientation;
if (cameraInfo.facing == getFrontFacingCameraId()) {
displayOrientation = (cameraInfo.orientation + degrees) % 360;
displayOrientation = (360 - displayOrientation) % 360;
} else {
displayOrientation = (cameraInfo.orientation - degrees + 360) % 360;
}
USER_CIRCLE_PHOTO.setImageBitmap(Bitmap.createScaledBitmap(rotateImage(thumbnail, displayOrientation), 480, 800, false));
getContentResolver().delete(IMG_URI, null, null);
} catch (Exception e) {
displayToast(this, "خطای گرفتن عکس:" + "\n" + e.toString());
}
}
}
}
如何解决问题 谢谢
当更改为:
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;
回来和相机不行!
答案 0 :(得分:2)
/***Inside your Picture Taken Call back try to change**/
private PictureCallback mPicture = new PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (pictureFile == null)
{
return;
}
try
{
path = pictureFile.getPath();
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
if (pictureFile.exists())
{
Bitmap largeIcon = BitmapFactory.decodeFile(pictureFile.getAbsolutePath());
if(cameraId == CameraInfo.CAMERA_FACING_BACK)
{
imageRotation(largeIcon);
}
else
{
rotateFrontImage(largeIcon);
}
}
/* * Make the callback to the calling activity to handle picture
* clicked*/
mCallback.imageClicked(pictureFile);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (Exception e)
{
e.printStackTrace();
}
}
};
/***********************************************/
public Bitmap rotateFrontImage(Bitmap source)
{
Bitmap rImg;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT)
{
Bitmap imgBitmap = source;
ExifInterface ei = null;
try
{
ei = new ExifInterface(path );
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch(orientation)
{
case ExifInterface.ORIENTATION_ROTATE_90:
imgBitmap = rotateImage(source, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
imgBitmap = rotateImage(source, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
imgBitmap = rotateImage(source, 270);
break;
}
} catch (IOException e)
{
e.printStackTrace();
}
Matrix rotateRight = new Matrix();
rotateRight.preRotate(270);
if(android.os.Build.VERSION.SDK_INT>13 && cameraId == CameraInfo.CAMERA_FACING_FRONT)
{
float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1};
//rotateRight = new Matrix();
Matrix matrixMirrorY = new Matrix();
matrixMirrorY.setValues(mirrorY);
rotateRight.postConcat(matrixMirrorY);
Log.i(TAG, "rotateFrontImage if mirrorY: "+mirrorY);
Log.i(TAG, "rotateFrontImage if matrixMirrorY: " + matrixMirrorY);
}
rotateRight.preRotate(90);
rImg= Bitmap.createBitmap(imgBitmap, 0, 0, imgBitmap.getWidth(), imgBitmap.getHeight(), rotateRight, true);
}
else
{
Matrix rotateRight = new Matrix();
rotateRight.preRotate(270);
if(android.os.Build.VERSION.SDK_INT>13 && cameraId == CameraInfo.CAMERA_FACING_FRONT)
{
float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1};
rotateRight = new Matrix();
Matrix matrixMirrorY = new Matrix();
matrixMirrorY.setValues(mirrorY);
rotateRight.postConcat(matrixMirrorY);
Log.i(TAG, "rotateFrontImage else mirrorY: "+mirrorY);
Log.i(TAG,"rotateFrontImage else matrixMirrorY: "+matrixMirrorY);
rotateRight.preRotate(270);
}
rImg= Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), rotateRight, true);
}
return rImg;
}