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

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

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

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

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

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

List previewSizes = params.getSupportedPreviewSizes();

List 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 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

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上变形显示的问题基本上就解决了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值