前置摄像头水平翻转问题

这几天在改前置摄像头,刚才看了csdn上关于此问题的热烈讨论,未得出最终结论。我觉得此问题还是有最优解的。
csdn android版主yiyaaixuexi 认为,前置camera要求: 缩略图和照片一致,并且与取景相反。 也就是在照相的瞬间,会翻折一次。刚刚拿iphone测试了一下,也是如此。
我用nokia测试,也是如此,但这样有一个问题,就是侧拿手机拍照时,缩略图里的人倒立。修改缩略图,使之与preview一致、与照片相反,问题就解决了。
实际这个问题有四个像:实像,preview,缩略图,照片;preview是照相时拍摄者在设备上看到的动态画面,缩略图是按下快门后定格的画面,照片是最终存储的文件。
现在主流设备如yiyaaixuexi所说,是preview与实像相反,而缩略图、照片与实像相同。这样的设计解决了以下两个问题:预览时的镜像效果,存储后图像正向、文字正常。但造成我前面提到的问题:预览画面和按下快门后的“预览图”(缩略图)反向,在侧机时表现尤为明显。解决方法很简单,把缩略图改成与实像相反。

刚刚看了高富帅朋友的苹果手机,苹果的缩略图虽与照片一致,但它用另一种方式解决了横放手机缩略图与preview倒立的问题:当横放手机时,通过Gsensor感应,旋转缩略图窗口。但是,这里还是有个bug!!!就是如果我将手机平放在桌上,此时Gsensor对XY轴感应失效,横着拍人时,结果preview与缩略图是上下反向的。因此,修改缩略图,使之与preview一致仍是目前的最优解。

-----------------------------------------------------------------------------------------------------------------

抱歉,今天想了下,发现修改缩略图使之与preview一致这种做法是不行的。因为当用户点击缩略图查看大图时,会产生严重的不适(图片被水平翻转了),在侧拍时尤为明显。所以还是应该遵循缩略图与最终存储图一致的原则。暂时没有想到比苹果那种方法更好的方案。


总结这两天的实验,前置摄像头有一个难题,即下述三个需求不可能同时满足:

1,预览时的镜面效果。

2,最终保存的图片与实景一致。

3,预览图与保存图(以及缩略图)一致。

在没有Gsensor的设备上,一般的做法是完全舍弃第三个需求,即水平翻转预览图,保存图、缩略图与实图相同,如Nokia N78。

有Gsensor的设备,可以在满足前两个条件的基础上,部分地满足第三个条件。苹果手机的做法是,当手机被横置时(Gsensor y轴读数的绝对值大),把保存图(以及缩略图)旋转(不是翻转)180度,这样虽没有做到需求3(预览图与保存图(以及缩略图)一致),但至少使得用户在拿起手机侧拍时不会发觉预览图(或点击预览图得到的大图)和preview是上下颠倒的。但如果用户将手机放在桌上,Gsensor就无用武之地,照片也不会被旋转,此时若用户横拍,则又会出现倒立的效果图。

------------------------------------------------------------------------------------------------------

在android摄像头应用Camera.java中,有这样一句话Util.setRotationParameter(mParameters, mCameraId, mOrientation);

类Util中的setRotationParameter函数设置了前置摄像头拍摄图的保存方向,观察这个函数,会发现其与后置摄像头的差别在于90°与270°角拍摄时的处理。从这种处理中也可以看出,当硬件设计者把摄像头按某个方向安放在设备上时,设备的“底边”就已经确定,详见我的为什么镜面成像是左右反而不是上下反(从前置摄像头说起)一文。

原文地址:https://www.cnblogs.com/yiru/p/2764330.html