浅析Android(安卓)Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)
转于:http://blog.csdn.net/yanzi1225627/article/details/17652643
------------------------------------------------------------------------------------------------
经常听人问Camera开发中,各种变形问题,今天有空就在此梳理总结下。
三个尺寸:
1、Surfaceview的尺寸
Surfaceview是用来预览Camera的,当它全屏时就是Screen的大小。
2、Picturesize的尺寸
这是拍照后的PictureSize尺寸。
3、Previewsize的尺寸
这是预览时帧数据的尺寸。
三种变形:
1、预览画面的物体长宽失真。原因是Surfaceview和Previewsize的长宽比率不一致,就会导致预览画面上失真。因为camera在显示时会将预览帧数据缩放成Surfaceview大小,当比率不一致必然会物体变形。至于这个缩放算法可能不同手机会有区别。
2、拍照后照片上物体变形。
3、点击拍照瞬间,预览画面上会突然变形然后恢复到正常预览。
2、3两种变形都是因为Previewsize和Picturesize的长宽比率不一致所致。总之一句话,为了保证图片不是真,要保证预览Surfaceview、Previewsize、Picturesize的长宽比率要一直。如果Surfaceview是全屏的话,要获取屏幕长和宽得到比率。
为此我写了一个工具类,获得合适的Picturesize和Previewsize,名字为:MyCamPara.java。
[java] view plain copy- packageorg.yanzi.util;
- importjava.util.Collections;
- importjava.util.Comparator;
- importjava.util.List;
- importandroid.hardware.Camera;
- importandroid.hardware.Camera.Size;
- importandroid.util.Log;
- publicclassMyCamPara{
- privatestaticfinalStringtag="yan";
- privateCameraSizeComparatorsizeComparator=newCameraSizeComparator();
- privatestaticMyCamParamyCamPara=null;
- privateMyCamPara(){
- }
- publicstaticMyCamParagetInstance(){
- if(myCamPara==null){
- myCamPara=newMyCamPara();
- returnmyCamPara;
- }
- else{
- returnmyCamPara;
- }
- }
- publicSizegetPreviewSize(List<Camera.Size>list,intth){
- Collections.sort(list,sizeComparator);
- inti=0;
- for(Sizes:list){
- if((s.width>th)&&equalRate(s,1.33f)){
- Log.i(tag,"最终设置预览尺寸:w="+s.width+"h="+s.height);
- break;
- }
- i++;
- }
- returnlist.get(i);
- }
- publicSizegetPictureSize(List<Camera.Size>list,intth){
- Collections.sort(list,sizeComparator);
- inti=0;
- for(Sizes:list){
- if((s.width>th)&&equalRate(s,1.33f)){
- Log.i(tag,"最终设置图片尺寸:w="+s.width+"h="+s.height);
- break;
- }
- i++;
- }
- returnlist.get(i);
- }
- publicbooleanequalRate(Sizes,floatrate){
- floatr=(float)(s.width)/(float)(s.height);
- if(Math.abs(r-rate)<=0.2)
- {
- returntrue;
- }
- else{
- returnfalse;
- }
- }
- publicclassCameraSizeComparatorimplementsComparator<Camera.Size>{
- //按升序排列
- publicintcompare(Sizelhs,Sizerhs){
- //TODOAuto-generatedmethodstub
- if(lhs.width==rhs.width){
- return0;
- }
- elseif(lhs.width>rhs.width){
- return1;
- }
- else{
- return-1;
- }
- }
- }
- }
对上面这个工具类注释如下:
1,是个单例模式类。调用示例:
[java] view plain copy- SizepictureS=MyCamPara.getInstance().getPictureSize(pictureSizes,800);
- myParam.setPictureSize(pictureS.width,pictureS.height);
2,程序首先对预览尺寸的list进行升序排序,因为实际中发现,有的手机提供的是升序有的是降序。
3,通过equalRate(Size s, float rate)保证Size的长宽比率。一般而言这个比率为1.333/1.7777即通常说的4:3和16:9比率。
4、在getPreviewSize()函数里增加判断if((s.width > th) && equalRate(s, 1.33f)),除保证比率外,还保证用户需要设置的尺寸宽度最小值。这个大家根据需要随便改。
更多相关文章
- android iphone手机分辨率尺寸比例整理
- Android(安卓)studio 3.1.2 开发环境搭建 各种错误,各种问题 Unab
- android 仿微信多图选择器(带预览、照相功能)
- 深入理解TextView.setTextSize()
- Android(安卓)mdpi ldpi hdpi区别
- Android缩放图片文件引起的OOM异常
- android 7自定义相机预览及拍照功能
- Android相机连续拍照实现连拍功能
- Android(安卓)APP常用图标尺寸规范