我已经查看了其他人提出这个问题的问题,但我不确定解决这个问题的最佳方法是什么。在通过Android的指南实现相机后,我所拥有的相机预览被锁定在风景中。我想知道如何调整相机方向以反映手机的方向。
我试过这个
camera.setDisplayOrientation(90);
这将相机锁定为纵向模式,因此我需要另一种解决方案(最好是适用于大多数设备的解决方案)。
另外,我怎样才能使保存的图像以与预览相同的方式显示?现在,如果我使用上面的代码行使预览变为纵向,则保存的图像仍然会旋转为景观。
答案 0 :(得分:4)
Camera.Parameters params= mCamera.getParameters();
params.set("rotation", 90);
mCamera.setParameters(params);
答案 1 :(得分:1)
在确定要选择的预览尺寸时,您需要考虑方向。例如,来自ApiDemos的getOptimalPreviewSize()
的{{1}}无法定位,只是因为他们的应用版本的方向已锁定为横向。如果您希望方向浮动,则需要反转目标纵横比以匹配。那么,CameraPreview
有这个
getOptimalPreviewSize()
和
double targetRatio=(double)width / height;
其中if (displayOrientation == 90 || displayOrientation == 270) {
targetRatio=(double)height / width;
}
是一个从0到360的值,我从大约100行的一些严重丑陋的代码中确定,这就是为什么我将所有这些包装在一个可重复使用的组件中,这是我'我将很快发布。
其次,在控制您正在使用的displayOrientation
/ SurfaceView
的宽高比时,您需要考虑该显示方向。来自TextureView
的{{1}}活动有自己的预览CameraPreview
来处理宽高比,您需要在纵向中反转宽高比:
ApiDemos
其中ViewGroup
是相同的值(90和270分别是纵向和反向肖像,并注意我没有尝试过反向肖像或反向横向工作,所以可能有需要更多调整)。
第三 - 您必须在if (displayOrientation == 90
|| displayOrientation == 270) {
previewWidth=mPreviewSize.height;
previewHeight=mPreviewSize.width;
}
else {
previewWidth=mPreviewSize.width;
previewHeight=mPreviewSize.height;
}
上致电displayOrientation
之前开始预览。否则,它就好像图片的宽高比被应用于预览帧一样,搞砸了。
setPictureSize()
答案 2 :(得分:0)
我使用谷歌的相机应用修复此问题。它通过使用传感器获取手机的方向,然后适当地设置EXIF标签。从相机发出的JPEG不会自动定向。
此外,相机预览仅在横向模式下正常工作。如果您需要将您的活动布局纵向定向,则必须使用方向传感器中的值手动完成。
我建议您查看照片的exif数据并特别注意
ExifInterface exif = new ExifInterface(SourceFileName); //API Level 5
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
发表评论并告诉我这是否对您有所帮助。