【发布时间】:2018-01-29 13:09:45
【问题描述】:
我有 Google Mobile Vision - CameraSource 的开源代码,这是我调用来点击照片的方法:cameraSource.takePicture();
在CameraSource.java的开源版本中,确定屏幕方向的方法是股票的一种:
private void setRotation(Camera camera, Camera.Parameters parameters, int cameraId) {
WindowManager windowManager =
(WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
int degrees = 0;
int rotation = windowManager.getDefaultDisplay().getRotation();
switch (rotation) {
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;
default:
Log.e(TAG, "Bad rotation value: " + rotation);
}
CameraInfo cameraInfo = new CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
int angle;
int displayAngle;
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
angle = (cameraInfo.orientation + degrees) % 360;
displayAngle = (360 - angle) % 360; // compensate for it being mirrored
} else { // back-facing
angle = (cameraInfo.orientation - degrees + 360) % 360;
displayAngle = angle;
}
// This corresponds to the rotation constants in {@link Frame}.
mRotation = angle / 90;
camera.setDisplayOrientation(displayAngle);
parameters.setRotation(angle);
}
这里,三星、联想、云塔H8的displayAngle和角度都是一样的。但是为 backCamera 返回的位图在每个设备中的旋转方式不同。我必须手动旋转每个设备的位图(三星:90,联想:0 和 Yuntab:180)
我的要求是 onPictureTaken 应该返回一个与当前显示方向匹配的位图。我正在研究这个,因为很长一段时间,但还必须想办法解决这个问题。下面是我的 onPicturetaken() (拍照后调用):
@Override
public void onPictureTaken(byte[] bytes) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, currentCameraId == 0 ? options : null);
}catch (Exception ex){
ex.printStackTrace();
Log.e("PictureTaken",ex.toString());
}
};
【问题讨论】:
-
上次我必须实现类似的东西时,我关注了this answer,它似乎工作正常。但是它看起来与您当前的代码相似
-
您的建议中的答案已经在 CamerSource.java 类中实现。对于相同配置(横向/纵向)的所有设备,它返回的值始终相同,但图像的旋转方式不同。
标签: android android-camera camera-calibration google-vision