我想水平地反转来自Surface
制作的TextureView
物体的帧。我能做的是将变换矩阵设置为这个TextureView
实例,而我postScale
为-1,x
为1,y
为1(保持不变),而postTranslate
dx
在视图的整个宽度上,并保持dy
不变(0F
)。
但是当我将设备旋转90度(水平)并关闭屏幕时出现问题:图像旋转180度,当然,它完全有意义,因为x
和y
轴没有改变。
如何解决?是否可以通过这种方式使用翻译矩阵来解决此问题?或者可能使用OpenGL ES工具?
P.S。:奇怪的是,与设备旋转本身相比,旋转两次完成两次,例如当我将设备旋转90度时 - 预览旋转180度。
P.S.S。:我试图使用Matrix
的setPolyToPoly
方法反转预览......并且得到了完全相同的结果。
P.S.S.S。:同样,使用open gl来实现目标,使用简单的比例和旋转变换为模型和投影基质,并得到完全相同的结果!
更新:
这些是描述前置摄像头默认行为的屏幕截图 - 默认情况下HAL应用帧反转,我无法读取文本;仍然,我是否旋转设备 - “框架方向”不会改变:
这些是我应用时的截图,例如Matrix.scaleM(modelMatrix, 0, -1F, 1F, 1F);
,然后将此矩阵应用于进入顶点着色器的每个坐标,所以我现在可以阅读文本,因为我自己应用了反演,因此HAL的反演与我的自定义反演将导致反转缺失,但是当我旋转我的设备时(旋转设备方向改变,当然,这就是禁用) - 我会看到自己翻转过来,当然,这是完全合理的,因为设备的坐标系赢得了'改变。不过,我希望能够以某种方式避免设备旋转本身的图像旋转(就像在默认模式下 - 设备是否旋转 - 预览图像只是“不关心”),并且仍然能够读取文字(我的意思是,像在肖像模式)。
你在前置或后置摄像头上运行测试吗?通常只需要将前置摄像头框架水平翻转,而不是后置摄像头。
无论如何,如果您需要基于设备方向的不同转换,您需要detect orientation changes in your Activity。当设备旋转时,相机不会自动执行任何操作,无论您选择哪种转换方法,都可以获得相同的结果。
更新#2
我刚刚意识到,如果在管道中的适当时刻应用转换,则可以解决此问题。我将展示一个工作示例,它广泛使用OpenGL,但我希望你能找到一些有用的东西。看到这个code fragment,它使用顶点着色器来变换坐标。在drawFrame()
,有一个电话给getTransformMatrix()
。不是执行此调用,而是从执行类似任务时编写的this method中获取矩阵。