转于: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
  1. packageorg.yanzi.util;
  2. importjava.util.Collections;
  3. importjava.util.Comparator;
  4. importjava.util.List;
  5. importandroid.hardware.Camera;
  6. importandroid.hardware.Camera.Size;
  7. importandroid.util.Log;
  8. publicclassMyCamPara{
  9. privatestaticfinalStringtag="yan";
  10. privateCameraSizeComparatorsizeComparator=newCameraSizeComparator();
  11. privatestaticMyCamParamyCamPara=null;
  12. privateMyCamPara(){
  13. }
  14. publicstaticMyCamParagetInstance(){
  15. if(myCamPara==null){
  16. myCamPara=newMyCamPara();
  17. returnmyCamPara;
  18. }
  19. else{
  20. returnmyCamPara;
  21. }
  22. }
  23. publicSizegetPreviewSize(List<Camera.Size>list,intth){
  24. Collections.sort(list,sizeComparator);
  25. inti=0;
  26. for(Sizes:list){
  27. if((s.width>th)&&equalRate(s,1.33f)){
  28. Log.i(tag,"最终设置预览尺寸:w="+s.width+"h="+s.height);
  29. break;
  30. }
  31. i++;
  32. }
  33. returnlist.get(i);
  34. }
  35. publicSizegetPictureSize(List<Camera.Size>list,intth){
  36. Collections.sort(list,sizeComparator);
  37. inti=0;
  38. for(Sizes:list){
  39. if((s.width>th)&&equalRate(s,1.33f)){
  40. Log.i(tag,"最终设置图片尺寸:w="+s.width+"h="+s.height);
  41. break;
  42. }
  43. i++;
  44. }
  45. returnlist.get(i);
  46. }
  47. publicbooleanequalRate(Sizes,floatrate){
  48. floatr=(float)(s.width)/(float)(s.height);
  49. if(Math.abs(r-rate)<=0.2)
  50. {
  51. returntrue;
  52. }
  53. else{
  54. returnfalse;
  55. }
  56. }
  57. publicclassCameraSizeComparatorimplementsComparator<Camera.Size>{
  58. //按升序排列
  59. publicintcompare(Sizelhs,Sizerhs){
  60. //TODOAuto-generatedmethodstub
  61. if(lhs.width==rhs.width){
  62. return0;
  63. }
  64. elseif(lhs.width>rhs.width){
  65. return1;
  66. }
  67. else{
  68. return-1;
  69. }
  70. }
  71. }
  72. }


对上面这个工具类注释如下:

1,是个单例模式类。调用示例:

[java] view plain copy
  1. SizepictureS=MyCamPara.getInstance().getPictureSize(pictureSizes,800);
  2. 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)),除保证比率外,还保证用户需要设置的尺寸宽度最小值。这个大家根据需要随便改。

更多相关文章

  1. android iphone手机分辨率尺寸比例整理
  2. Android(安卓)studio 3.1.2 开发环境搭建 各种错误,各种问题 Unab
  3. android 仿微信多图选择器(带预览、照相功能)
  4. 深入理解TextView.setTextSize()
  5. Android(安卓)mdpi ldpi hdpi区别
  6. Android缩放图片文件引起的OOM异常
  7. android 7自定义相机预览及拍照功能
  8. Android相机连续拍照实现连拍功能
  9. Android(安卓)APP常用图标尺寸规范

随机推荐

  1. Win7 64位 Android SDK下载和更新失败的
  2. 【Android单元测试系列】真正的异步单元
  3. android 设置apk文件默认安装sdcard中
  4. MPAndroidChart~BubbleChart(气泡图) and
  5. Android(安卓)控制闪光灯
  6. Android SDK1.0 Permission 大全访问权限
  7. android使用notifyDataSetChanged()方法,a
  8. Android之生成桌面快捷方式(二)
  9. Android:Android Support Design之TabLay
  10. Android键盘映射