Android捕捉图像后在SurfaceView上变形显示问题的处理

我们在Android中经常会使用SurfaceView编写自定义的摄像头,可是有的时候会经常会出现图像的变形,我们就会很郁闷的问这到底是为什么呢?其实这个最根本的原因是SurfaceView和PreViewSize的尺寸不是同一个比率。

所谓PreViewSize就是在预览的时候帧数据的尺寸,SurfaceView是用来预览Camera的视图,它的尺寸也就是Screen全屏时候的大小。还有一个重要尺寸的是PictureSize,这个是拍照后图片的尺寸,就是所保存的结果图片的大小。

所以解决刚刚问题就是调用Camera的takePicture方法之前设置一下Camera的PictureSize和PreviewSize两个参数,分别调用的方法是setPictureSize和setPreviewSize。

然后实际的PictureSize和PreviewSize可通过如下步骤得到的:

首先是得到该手机可以适配的一系列尺寸

List<Size> previewSizes = params.getSupportedPreviewSizes();
List<Size> pictureSizes = params.getSupportedPictureSizes();  

然后得到自己的屏幕的尺寸

public static float getScreenRate(Context context){
     Point P = getScreenMetrics(context);
     float H = P.y;
     float W = P.x;
     return (W/H);
} 

最后根据自己的尺寸大小,从适配的尺寸当中取一些属于自己规格的尺寸

public  Size getPropPreviewSize(List<Camera.Size> list, float th, int minWidth){
    Collections.sort(list, sizeComparator);
    int i = 0;
    for(Size s:list){
        if((s.width >= minWidth) && equalRate(s, th)){
            Log.i(TAG, "PreviewSize:w = " + s.width + ",h = " + s.height);
            break;
        }
        i++;
    }
    if(i == list.size()){
        i = 0;//如果没找到,就选最小的size
    }
    return list.get(i);
}  

得到PreViewSize后,同理得到PictureSize

public Size getPropPictureSize(List<Camera.Size> list, float th, int minWidth){
    Collections.sort(list, sizeComparator);
    int i = 0;
    for(Size s:list){
        if((s.width >= minWidth) && equalRate(s, th)){
            Log.i(TAG, "PictureSize : w = " + s.width + ",h = " + s.height);
            break;
        }
        i++;
    }
    if(i == list.size()){
        i = 0;//如果没找到,就选最小的size
    }
    return list.get(i);
}  

设置尺寸

mParams = mCamera.getParameters();
//设置PictureSize
Size pictureSize = getPropPictureSize(mParams.getSupportedPictureSizes(),previewRate, 1280);
mParams.setPictureSize(pictureSize.width, pictureSize.height);
//设置PreviewSize
Size previewSize = getPropPreviewSize(mParams.getSupportedPreviewSizes(), previewRate, 1280);
mParams.setPreviewSize(previewSize.width, previewSize.height); 

这样子关于在Android上调用Camera捕捉图像后在SurfaceView上变形显示的问题基本上就解决了!

时间: 2024-12-29 11:12:11

Android捕捉图像后在SurfaceView上变形显示问题的处理的相关文章

[Android] 给图像添加相框、圆形圆角显示图片、图像合成知识

    前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放.移动.绘制和添加水印,继续我的"随手拍"项目完成给图片添加相框.圆形圆角显示图片和图像合成的功能介绍.希望文章对大家有所帮助. 一. 打开图片和显示assets文件中图片 首先,对XML中activity_main.xml进行布局,通过使用RelativeLayout相对布局完成(XML代码后面附).然后,在Mainctivity.java中public class MainActivity e

[Android] 给图像加入相框、圆形圆角显示图片、图像合成知识

    前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放.移动.绘制和加入水印,继续我的"随手拍"项目完毕给图片加入相框.圆形圆角显示图片和图像合成的功能介绍.希望文章对大家有所帮助. 一. 打开图片和显示assets文件里图片 首先,对XML中activity_main.xml进行布局,通过使用RelativeLayout相对布局完毕(XML代码后面附).然后,在Mainctivity.java中public class MainActivity e

android的开发 华为手机上不显示menu键

android的开发,华为手机上不显示menu键解决办法: 在AndroidManifest.xml中讲targetSdkVersion改为9. <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="9" /> 原因: (2)高版本默认OptionsMenu在ActionBar里,不会有虚拟menu键: (1)华为没有菜单键的硬按钮.

Android Button悬浮在SurfaceView上

实现Button悬浮于与SurfaceView之上实现 注意:你实现的SurfaceView和android中的Button,EditView是同级的,不能把一个包含在另一个里面 1.创建自己的SurfaceView类,一定要实现2个参数的那个函数,因为你要在XMl中使用,第二个参数指的自定义的组件的一些属性长宽等. public GameSurfaceView(Context context, AttributeSet attrs){ super(context,attrs); } <dk.g

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)

Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Android UI2013-05-23 15:04 1600人阅读 评论(1) 收藏 举报 目录(?)[+] http://blog.csdn.net/yanzi1225627/article/details/8580034 最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在

Activity设置style透明后与SurfaceView合用引发的无形命案

最近搞视频通话,SurfaceView是必不可少的,由于启动视频要加载一些资源,比较耗时,会有1.2s黑屏的现象,为了改善用户体验,我们需要设置Activity的Theme为透明风格(QQ 也是如此),下面是我截取的日志,QQ和我们启动视频通话界面(Activity)所花费的时间: Displayed com.xxx.xxx/.activity.voip.CallVoipVideoActivity: +491ms:接收视频邀请 Displayed com.xxx.xxxx/.activity.v

Android提高第二篇之SurfaceView的基本使用

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上次介绍MediaPlayer的时候略微介绍了SurfaceView,SurfaceView因为能够直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的画图容器,这次我就用两篇文章来介绍SurfaceView的使用方法.网上介绍SurfaceView的使用方法有非常多,写法也层出不同,比如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个能够依据功能实际须

Android多媒体图像的处理

一.图像的两种分类 位图:也被称为点阵图像或者绘制图像,是由像素的一系列单个点组成的.这些点可以进行不同的排列和染色以构成图样.当放大位图时,从而使得线条和形状显得参差不齐. 矢量图:也被称为面向对象的图像或绘图图像,在数学上定义为一系列由先连接的点.也就是常说的数学函数的轨迹. 二.图像的加载 1.普通图片加载到内存 先将一张小图片拷贝到内存卡中,布局就一个ImageView和Button,点击Button加载出图像. Button的点击事件: public void loadImage(Vi

Android 中图片压缩分析(上)

作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情况下,改变图片的存储体积,而后者则是降低图像尺寸,达到相同目的. 由于本文的篇幅问题,分为上下两篇发布. 二.Android 质量压缩逻辑 在Android中,对图片进行质量压缩,通常我们的实现方式如下所示: ByteArrayOutputStream outputStream = new Byte