转至 (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。

  1. package org.yanzi.util;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;
  5. import android.hardware.Camera;
  6. import android.hardware.Camera.Size;
  7. import android.util.Log;
  8. public class MyCamPara {
  9. private static final String tag = "yan";
  10. private CameraSizeComparator sizeComparator = new CameraSizeComparator();
  11. private static MyCamPara myCamPara = null;
  12. private MyCamPara(){
  13. }
  14. public static MyCamPara getInstance(){
  15. if(myCamPara == null){
  16. myCamPara = new MyCamPara();
  17. return myCamPara;
  18. }
  19. else{
  20. return myCamPara;
  21. }
  22. }
  23. public  Size getPreviewSize(List<Camera.Size> list, int th){
  24. Collections.sort(list, sizeComparator);
  25. int i = 0;
  26. for(Size s: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. return list.get(i);
  34. }
  35. public Size getPictureSize(List<Camera.Size> list, int th){
  36. Collections.sort(list, sizeComparator);
  37. int i = 0;
  38. for(Size s: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. return list.get(i);
  46. }
  47. public boolean equalRate(Size s, float rate){
  48. float r = (float)(s.width)/(float)(s.height);
  49. if(Math.abs(r - rate) <= 0.2)
  50. {
  51. return true;
  52. }
  53. else{
  54. return false;
  55. }
  56. }
  57. public  class CameraSizeComparator implements Comparator<Camera.Size>{
  58. //按升序排列
  59. public int compare(Size lhs, Size rhs) {
  60. // TODO Auto-generated method stub
  61. if(lhs.width == rhs.width){
  62. return 0;
  63. }
  64. else if(lhs.width > rhs.width){
  65. return 1;
  66. }
  67. else{
  68. return -1;
  69. }
  70. }
  71. }
  72. }

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

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

  1. Size pictureS = 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)),除保证比率外,还保证用户需要设置的尺寸宽度最小值。这个大家根据需要随便改。

如果您觉得笔者在认真的写博客,请为我投上一票,谢谢大家。

浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)的更多相关文章

  1. Android应用开发中webview上传文件的几种思路

    1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClie ...

  2. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  3. Android应用开发中关于this.context=context的理解

    在Android应用开发中,有的类里面需要声明一个Context的成员变量,然后还需要在该类的构造函数中加上this.context=context;这行代码.为什么要这么写呢?不写不行么? 先看下面 ...

  4. 在Android开发中,定时器一般有以下3种实现方法

    在Android开发中,定时器一般有以下3种实现方法: 原文地址http://www.360doc.com/content/12/0619/13/87000_219180978.shtml 一.采用H ...

  5. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

  6. Android应用开发中三种常见的图片压缩方法

    Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法 private Bitmap com ...

  7. Android学习开发中如何保持API的兼容

    Android学习开发中如何保持API的兼容: 1,采用良好的设计思路 在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久 面向用例的设计,收集用户建议,把自己模拟成用户,保证AP ...

  8. [转]PHP开发中涉及到emoji表情的三种处理方法

    最近几个月做微信开发比较多,存储微信昵称必不可少,可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一 ...

  9. Android Camera开发:周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)

    参考:Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled) 最近做Android人脸识别时,camera在自 ...

随机推荐

  1. vue中$router和$route的区别

    $router是VueRouter的实例,在script标签中想要导航到不同的URL,使用$router.push方法. 返回上一个历史history用$router.to(-1) $route为当前 ...

  2. win8共享文件设置 详细教程

    1.开放防火墙445端口 2.进入组策略,依次进入 从网络访问计算机 属性里--添加-Guest 3.进入 然后把里面的用户清空 4.打开网络和共享中心,关闭密码保护共享

  3. 问题-DelphiXE10.1 FireDAC联接oracle数据库方法

    问题现象:安装oracle后,安装Delphi10.1,放FDConnection1时,选择"Ora"驱动时,提示如下: [FireDAC][Phys][Ora]-315. Can ...

  4. ubuntu 12.04下编译安装nginx-1.9.3

    1,下载nginx-1.9.3.tar.gz 两种方式: (1).ubuntu 下终端中(ctrl+alt+t) 运行命令: wget http://nginx.org/download/nginx- ...

  5. Thinkphp动态切换主题

    'DEFAULT_THEME' => '2014', 'TMPL_DETECT_THEME' => true, // 自动侦测模板主题 'THEME_LIST' => '2012,2 ...

  6. [Linux实用工具]Linux监控工具munin的展示(Nginx)

    Munin的安装和配置可以参考第一篇文章: [Linux实用工具]Linux监控工具munin的安装和配置 http://www.cnblogs.com/rond/p/3757804.html Mun ...

  7. [Python Essential Reference, Fourth Edition (2009)]读书笔记

    Python programs are executed by an interpreter. When you use Python interactively, the special varia ...

  8. Android——Android Sutido:[2]导入eclipse项目篇

    说明:直接导入,不用先将eclipse先转出再导入 原文地址:http://jingyan.baidu.com/article/bea41d43698ca3b4c51be68e.html

  9. 工具软件 PYUV打开raw图片

    引自:http://blog.csdn.net/lavenderss/article/details/51495648 [pYUV]如何打开YUV/RGB图片 pYUV工具本身使用起来比较简单,但如果 ...

  10. Spring Cloud Config 自动刷新所有节点 架构改造

    详细参考:<Sprin Cloud 与 Docker 微服务架构实战>p162-9.9.4节 要做的改动是: 1.在spring cloud config server 服务端加入 spr ...