Android 如何在设备处于横向时拍摄人像照片

Android 如何在设备处于横向时拍摄人像照片,android,camera,Android,Camera,我正在为一个设备制作一个相当专业的相机应用程序,这个设备在物理上总是以横向的方式进行。该规范的一部分是,它必须能够选择性地以纵向方向预览和拍照-请参阅下面的配置“a”。 (现在,在有人投票结束这一问题之前,我要指出,另一个问题仅仅是关于这是否可能的问题——声称的答案是肯定的。这个问题是关于如何做到这一点。) 我已经为预览设置了一个TextureView,名为camera.setPreviewTexture(),因此我可以在屏幕上看到相机的图像。我也有代码启动和运行,这是我所需要的横向版本,请参

我正在为一个设备制作一个相当专业的相机应用程序,这个设备在物理上总是以横向的方式进行。该规范的一部分是,它必须能够选择性地以纵向方向预览和拍照-请参阅下面的配置“a”。

(现在,在有人投票结束这一问题之前,我要指出,另一个问题仅仅是关于这是否可能的问题——声称的答案是肯定的。这个问题是关于如何做到这一点。)

我已经为预览设置了一个TextureView,名为camera.setPreviewTexture(),因此我可以在屏幕上看到相机的图像。我也有代码启动和运行,这是我所需要的横向版本,请参阅下面的配置“B”

为了设置相机参数,我首先使用getParameters()读取相机自己的设置,然后只修改我想要更改的设置。因此,在配置“B”的情况下,只需执行以下代码:

camera_parameters = camera.getParameters();
camera_parameters.setPreviewSize(640,480); 
camera_parameters.setPictureSize(640,480); 
camera.setParameters(camera_parameters);
camera_parameters = camera.getParameters();
camera_parameters.set("orientation", "portrait");
camera_parameters.setPreviewSize(640,480); 
camera_parameters.setPictureSize(640,480); 
camera.setParameters(camera_parameters);
编辑:我已经检查了640x480是否可用于预览和图片大小)。 然后,该应用程序完全按照我的预期工作

试图使配置“A”正常工作时出现问题。这一次,我将纹理视图设置为宽于高,并执行以下代码:

camera_parameters = camera.getParameters();
camera_parameters.setPreviewSize(640,480); 
camera_parameters.setPictureSize(640,480); 
camera.setParameters(camera_parameters);
camera_parameters = camera.getParameters();
camera_parameters.set("orientation", "portrait");
camera_parameters.setPreviewSize(640,480); 
camera_parameters.setPictureSize(640,480); 
camera.setParameters(camera_parameters);
不幸的是,这并不完全起作用。当应用程序运行时,我得到的结果更像这样: 正如您所看到的,此预览中显示的图像本质上是一个比高宽的图像,它已变形为一个比宽高的矩形。生成的保存的jpeg图像文件也比其高宽

我认为可能需要将代码更改为以下内容:

camera_parameters = camera.getParameters();
camera_parameters.set("orientation", "portrait");
camera_parameters.setPreviewSize(480,640); 
camera_parameters.setPictureSize(480,640); 
camera.setParameters(camera_parameters);
但这会导致异常“setParameters failed”


所以我的问题是,在
camera.getParameters()之间,我应该设置哪些参数来设置哪些值
设置参数(摄像机参数)

我经常使用相机和图片来实现类似于“孔中面”的应用程序 在这种情况下,问题是您试图用绝对值设置大小

 camera_parameters.setPreviewSize(480,640);
 camera_parameters.setPictureSize(480,640); 
这可能会在您的手机/仿真器上引发异常,而在另一个手机/仿真器上则可以正常工作。问题是,您必须读取允许的大小(与相机相关),并创建一个算法在它们之间进行选择。 功能包括:

  • 在这里,您可以找到一个非常简单的示例:

     mCamera = Camera.open();
     Camera.Parameters params = mCamera.getParameters();
     List<Size> sizes = params.getSupportedPictureSizes();
     // See which sizes the camera supports and choose one of those
     mSize = sizes.get(0);
     params.setPictureSize(mSize.width, mSize.height);
     mCamera.setParameters(params);
    
    mCamera=Camera.open();
    Camera.Parameters params=mCamera.getParameters();
    列表大小=params.getSupportedPictureSizes();
    //查看相机支持的尺寸,然后选择其中一种
    mSize=size.get(0);
    参数setPictureSize(mSize.width,mSize.height);
    mCamera.setParameters(参数);
    

    有了这些技巧,您可以找到最符合您期望的解决方案。

    +1因为您的问题刚刚回答了我一段时间以来关于如何设置照片大小的问题。没有要求任何设备支持480x640/640x480预览或图片。请使用
    摄像机参数上的适当方法,找出可用的参数。类似地,不要求任何设备遵守
    设置(“方向”、“肖像”)
    或任何其他字符串组合。要从横向中的设备进行纵向预览,我将
    TextureView
    90度旋转。我怀疑在横向拍摄时是否能够可靠地拍摄人像照片。仅供参考,我已经检查并打印了可用预览和图片大小的列表,并且640480可用(我将编辑OP)。我不确定“将纹理视图旋转90度”的确切含义。我已经完全做到了这一点(请参阅“编辑”)(在原问题中)。这证实了640x480可用于预览和图片。我还注意到,对于高度大于宽度的任何支撑尺寸,都没有选项。我刚才以为这是由布景(“方位”、“肖像”)来迎合的。。。也许不是!也许这是不可能的?