解决Camera.parameter.setPreviewSize/Camera.parameter.setPictureSize适应不同手机问题

本文介绍了一个用于优化Android设备上相机预览和拍照尺寸的类MyCamPara。该类通过单例模式实现,并提供方法来获取最合适的预览和图片尺寸。尺寸选择基于一定的阈值和宽高比条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决类:(当然这个也是套用大师的!)
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import android.hardware.Camera;
import android.hardware.Camera.Size;

public class MyCamPara {
	private final 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);
		Size size=null;
		for(int i=0;i<list.size();i++){
			size=list.get(i);
			if((size.width>th)&&equalRate(size, 1.3f)){
				break;
			}
		}
		return size;
	}
	public Size getPictureSize(List<Camera.Size> list, int th){
		Collections.sort(list, sizeComparator);
		Size size=null;
		for(int i=0;i<list.size();i++){
			size=list.get(i);
			if((size.width>th)&&equalRate(size, 1.3f)){
				break;
			}
		}
		return size;
		
	}
	
	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>{
		//按升序排列
		@Override
		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;
			}
		}
		
	}
}

调用方法:

private static Size pictureSize,previewSize;
pictureSize= MyCamPara.getInstance().getPictureSize(parameter.getSupportedPictureSizes(), 800);  
		//预览大小
previewSize=MyCamPara.getInstance().getPreviewSize(parameter.getSupportedPreviewSizes(), display.getHeight());  
if(previewSize!=null)
	parameter.setPreviewSize(previewSize.width,previewSize.height);
if(pictureSize!=null)
	parameter.setPictureSize(pictureSize.width,pictureSize.height);


非常抱歉,我之前的回答有误,Android Camera.Parameters确实没有提供setPreviewFlipped()方法来设置预览镜像。如果您需要设置预览镜像效果,可以使用以下两种方法: 1. 使用Matrix类来翻转预览视图 您可以使用Matrix类来翻转预览视图。在setPreviewCallback()方法中,获取相机预览数据的byte[]数组,将其转换为Bitmap对象,使用Matrix类将Bitmap对象水平或垂直翻转,然后将其显示在SurfaceView上。 以下是一个示例代码片段,演示如何使用Matrix类来翻转预览视图: ```java Camera camera = Camera.open(); Camera.Parameters parameters = camera.getParameters(); // 设置预览大小 parameters.setPreviewSize(640, 480); camera.setParameters(parameters); // 绑定SurfaceView并开始预览 SurfaceView surfaceView = findViewById(R.id.surface_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); // 设置预览回调 camera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // 将预览数据转换为Bitmap对象 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // 创建Matrix对象并翻转Bitmap Matrix matrix = new Matrix(); matrix.preScale(-1, 1); Bitmap flippedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); // 显示翻转后的Bitmap surfaceView.draw(new BitmapDrawable(getResources(), flippedBitmap)); } }); ``` 在上面的代码中,我们使用Matrix类的preScale()方法将Bitmap对象水平翻转,然后使用Bitmap.createBitmap()方法创建翻转后的Bitmap对象,并将其显示在SurfaceView上。 2. 使用Camera.CameraInfo类来翻转预览视图 您也可以使用Camera.CameraInfo类的facing属性来翻转预览视图。在Camera.open()之后,您可以调用Camera.CameraInfo类的静态方法getCameraInfo()来获取相机信息,然后使用Camera.Parameters类的setPreviewSize()方法设置预览大小,并根据Camera.CameraInfo类的facing属性设置预览镜像。 以下是一个示例代码片段,演示如何使用Camera.CameraInfo类来翻转预览视图: ```java Camera camera = Camera.open(); Camera.Parameters parameters = camera.getParameters(); // 设置预览大小 parameters.setPreviewSize(640, 480); // 获取相机信息 Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); Camera.getCameraInfo(0, cameraInfo); // 根据相机信息设置预览镜像 if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { parameters.setPreviewSize(640, 480); camera.setDisplayOrientation(180); } camera.setParameters(parameters); // 绑定SurfaceView并开始预览 SurfaceView surfaceView = findViewById(R.id.surface_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); ``` 在上面的代码中,我们使用Camera.CameraInfo类的getCameraInfo()方法获取相机信息,然后根据相机信息的facing属性设置预览镜像。如果相机是前置摄像头,我们将预览大小设置为640x480,并使用Camera.setDisplayOrientation()方法将预览旋转180度,实现水平翻转的效果。如果相机是后置摄像头,我们不进行任何操作,保持预览不变。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值