首页 文章

如何旋转相机预览以纵向模式拍摄风景照片?

提问于
浏览
4

我看到很多人希望拍摄肖像照片,告诉他们将相机旋转90度 . 然而,无论我尝试什么,实际上“旋转”的唯一的东西是相机拍摄的图像,但它保留了它的宽度和高度比例,所以会发生的情况是,如果SurfaceView很窄并且图像不会失真高 .

我想要实现的是拍摄一张4x3照片,该照片不会在3x4布局中扭曲 . 我知道它会相当狭窄,但目标是旋转预览视图-90度并保持相机的正常宽高比 . 就目前而言,如果我想要将照片定位在我的肖像布局中,我尝试过的所有内容都会导致图像被压扁 .

我开始怀疑我需要在预览中应用矩阵将旋转-90度,但我不确定如何去做,或者这实际上是正确的方法 . 会喜欢一些建议 .

编辑:要清楚这里是javadocs的相关摘录:setPreviewSize()“如果显示方向设置为0或180,预览大小应设置为480x320 . 如果显示方向设置为90或270,预览大小应该设置为320x480 . “

这完全无法解决您希望将设备保持在纵向模式但将相机预览显示在小景观窗口中的情况(这是我正在尝试实现的) .

TIA

2 回答

  • 3

    如果您使用SurfaceView显示相机预览输出,并且您希望确保预览不会在预览或横向中失真,则必须确保SurfaceView的宽高比与相机的宽高比相匹配预览尺寸 . SurfaceView将简单地缩放预览以适合其内部,因此如果预览大小为640x480时预览为500x500,则预览将显示为垂直拉伸 .

    概念上最简单的方法是使用LayoutParamssetLayoutParams简单地手动将SurfaceView 's width and height, by updating the SurfaceView'布局设置为固定大小的布局 . 这种方法的问题在于它可能会因屏幕尺寸不同而变脆,因为你需要弄清楚你想要的像素大小,以及在Android上直观的跨设备布局,你真的想在dp中思考而不是像素 . 但是对于测试,您可以强制SurfaceView具有测试设备屏幕的宽度和高度设置

    surface height = preview height / preview width * surface width
    

    更好的方法是创建一个从SurfaceView继承的新类,它在View的onMeasure方法中进行必要的宽高比调整 . 详细解释是冗长的,但请查看Android开发人员's site for details. But roughly speaking, you need to set width/height values that always result in the same aspect ratio as the camera preview size you' ve配置的custom components documentation .

    一旦你有了正确大小的surfaceView,你通常还需要用setDisplayOrientation旋转相机预览输出;计算方向数学可能会令人困惑,因此请使用上面文档链接中提供的代码示例来解决问题 .

    基本上,世界上有一个坐标系,相机传感器有另一个(固定在设备上),而UI系统有第三个(固定在你当前的方位),这三个都可能相互变化 . 虽然正确的预览方向不依赖于设备相对于世界的位置,但相机拍摄的照片的方向确实如此(由setRotation设置) .

  • -6

    我的建议是,

    不要在Android上尝试更多布局,这很难实现 . 如果你想要实现,你必须阅读Android的开源代码,并且应该自己改变 .

    所以,我建议你使用Canvas(Import Graphics包)并使用这些类 .

相关问题