浅析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。
- package org.yanzi.util;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
- import android.hardware.Camera;
- import android.hardware.Camera.Size;
- import android.util.Log;
- public class MyCamPara {
- private static final String tag = "yan";
- private CameraSizeComparator sizeComparator = new CameraSizeComparator();
- private static MyCamPara myCamPara = null;
- private MyCamPara(){
- }
- public static MyCamPara getInstance(){
- if(myCamPara == null){
- myCamPara = new MyCamPara();
- return myCamPara;
- }
- else{
- return myCamPara;
- }
- }
- public Size getPreviewSize(List<Camera.Size> list, int th){
- Collections.sort(list, sizeComparator);
- int i = 0;
- for(Size s:list){
- if((s.width > th) && equalRate(s, 1.33f)){
- Log.i(tag, "最终设置预览尺寸:w = " + s.width + "h = " + s.height);
- break;
- }
- i++;
- }
- return list.get(i);
- }
- public Size getPictureSize(List<Camera.Size> list, int th){
- Collections.sort(list, sizeComparator);
- int i = 0;
- for(Size s:list){
- if((s.width > th) && equalRate(s, 1.33f)){
- Log.i(tag, "最终设置图片尺寸:w = " + s.width + "h = " + s.height);
- break;
- }
- i++;
- }
- return list.get(i);
- }
- public boolean equalRate(Size s, float rate){
- float r = (float)(s.width)/(float)(s.height);
- if(Math.abs(r - rate) <= 0.2)
- {
- return true;
- }
- else{
- return false;
- }
- }
- public class CameraSizeComparator implements Comparator<Camera.Size>{
- //按升序排列
- public int compare(Size lhs, Size rhs) {
- // TODO Auto-generated method stub
- if(lhs.width == rhs.width){
- return 0;
- }
- else if(lhs.width > rhs.width){
- return 1;
- }
- else{
- return -1;
- }
- }
- }
- }
对上面这个工具类注释如下:
1,是个单例模式类。调用示例:
- Size pictureS = 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 Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)的更多相关文章
- Android应用开发中webview上传文件的几种思路
1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClie ...
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...
- Android应用开发中关于this.context=context的理解
在Android应用开发中,有的类里面需要声明一个Context的成员变量,然后还需要在该类的构造函数中加上this.context=context;这行代码.为什么要这么写呢?不写不行么? 先看下面 ...
- 在Android开发中,定时器一般有以下3种实现方法
在Android开发中,定时器一般有以下3种实现方法: 原文地址http://www.360doc.com/content/12/0619/13/87000_219180978.shtml 一.采用H ...
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...
- Android应用开发中三种常见的图片压缩方法
Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法 private Bitmap com ...
- Android学习开发中如何保持API的兼容
Android学习开发中如何保持API的兼容: 1,采用良好的设计思路 在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久 面向用例的设计,收集用户建议,把自己模拟成用户,保证AP ...
- [转]PHP开发中涉及到emoji表情的三种处理方法
最近几个月做微信开发比较多,存储微信昵称必不可少,可这万恶的微信支持emoji表情做昵称,这就有点蛋疼了 一般Mysql表设计时,都是用UTF8字符集的.把带有emoji的昵称字段往里面insert一 ...
- Android Camera开发:周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)
参考:Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled) 最近做Android人脸识别时,camera在自 ...
随机推荐
- c++ primer读书笔记之c++11(四)
1 带有作用域的枚举 scoped-enumeration 相信大家都用过枚举量,都是不带有作用域的,在头文件中定义需要特别注意不要出现重名的情况.为了解决这种问题,c++11提供了带作用于的枚举. ...
- Linux内核分析:recv、recvfrom、recvmsg函数实现
先看一下这三个函数的声明: #include <sys/types.h> #include <sys/socket.h> ssize_t recv(int sockfd, vo ...
- LVS之NAT模型、DR模型配置和持久连接
前言:继LVS概述,本篇实现NAT模型和DR模型下的负载均衡. NAT模型: LVS-NAT基于cisco的LocalDirector.VS/NAT不需要在RealServer上做任何设置,其只要能提 ...
- 不要问我有多懒,写个脚本跑django
写django的都知道,要跑起django测试环境,只需要 python manage.py runserver 就可以了,但是时间一长,就觉得敲这个命令太浪费时间了,而我又是个懒人. 同事用的是ct ...
- git 修改上次提交信息 与 撤销此操作.
git commit --amend 修改刚才提交的commit信息 撤销 git commit --amend 思路是使用 git reflog 查看在哪里ammend的.找到HEAD{N}, N是 ...
- win7+php5.3.10下安装memcache (转)
因为升级到了5.3.10,所以之前的dll不能使用了,弄了好久,终于还是在老外的博客上找到了解决方法: (环境是win7+php5.3.10+win32) 1.解压附件memcached到某个目录,本 ...
- PHP中路径的相关配置
1. get_include_path() 取得当前的环境变量,即php.ini里设置的 include_path; set_include_path() 是设置include的路径,通过此设置后可以 ...
- Android——FilenameFilter总结(转)
一.FilenameFilter介绍 java.io.FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件: 一般地: (1)String[] fs = f.l ...
- android开发(28) 做个 指南针 应用
参考网上的资料,做了个指南针应用玩玩. 步骤: 1.获得 SensorManager. mSensorManager = (SensorManager) getSystemService(SENSOR ...
- java File linux windows 下 绝对路径 相对路径问题
前言 当前项目目录 windows 为 E:\project\testpro\ linux 为 /project/testpro/ Windows环境下获取绝对路径情况 使用 a/b/c 为路径, ...