【发布时间】:2012-01-10 01:33:19
【问题描述】:
在我的相机应用中,您可以在前后摄像头之间切换。 当我用后置摄像头拍照时,图片与预览显示的一样。 但是当我切换到前置摄像头时,图片是mirrorrd。我认为前后摄像头处于横向模式有关系。 我已经尝试了几乎所有关于 SO 的答案。
如果有人能指出我正确的方向,那真的很有帮助。
【问题讨论】:
标签: java android camera landscape
在我的相机应用中,您可以在前后摄像头之间切换。 当我用后置摄像头拍照时,图片与预览显示的一样。 但是当我切换到前置摄像头时,图片是mirrorrd。我认为前后摄像头处于横向模式有关系。 我已经尝试了几乎所有关于 SO 的答案。
如果有人能指出我正确的方向,那真的很有帮助。
【问题讨论】:
标签: java android camera landscape
发现前置摄像头的问题是 android 4.0+ 所特有的。 所以在你解码了方法“onPictureTaken”中的字节数组之后
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap photo = BitmapFactory.decodeByteArray(data,0,data.length);
photo = rotateBitmap(photo); //.....do some stuff }
只需调用 rotateBitmap 即可旋转位图
private Bitmap rotateBitmap(Bitmap bitmap){
Matrix rotateRight = new Matrix();
rotateRight.preRotate(90);
if(android.os.Build.VERSION.SDK_INT > 13 && CameraActivity.frontCamera)
{
float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1};
rotateRight = new Matrix();
Matrix matrixMirrorY = new Matrix();
matrixMirrorY.setValues(mirrorY);
rotateRight.postConcat(matrixMirrorY);
rotateRight.preRotate(270);
}
final Bitmap rImg= Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(), rotateRight, true);
return rImg;
}
【讨论】:
我找到了答案,做mCamera.setDisplayOrientationa(int degrees); 没有帮助。我必须镜像生成的位图才能得到我想要的结果。我使用 Matrix 方法来实现这一点。
float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1};
Matrix matrix = new Matrix();
Matrix matrixMirrorY = new Matrix();
matrixMirrorY.setValues(mirrorY);
matrix.postConcat(matrixMirrorY);
image = Bitmap.createBitmap(mBitmap, 0, 0, frame.getWidth(), frame.getHeight(), matrix, true)
【讨论】:
我认为您正在寻找 setDisplayOrientation(int)。他们有一个功能可能对开发网站有所帮助:
http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation%28int%29
【讨论】: