解决自定义相机分辨率适配、扭曲的问题
在自定义相机和扫码的时候,如果不设置相机的默认分辨率,有可能导致相机用的是最小的分辨率,照出来的照片很模糊。
所以自定义相机的时候,需要获取屏幕分辨率,相机的预览分辨率,进行最佳的匹配。
由于相机的预览分辨率几乎都是 按照横屏的来描述的,eg 1920*1080
而手机一般是竖屏的,如果自定义的相机是竖屏的,匹配相机预览分辨率的时候,如果直接传入当前的屏幕宽高是,匹配不到最佳的分辨率的
如果有虚拟键盘,就更匹配不到,最后就会取一个相机的最大预览分辨率,但是这个并不一定是最佳匹配的,有可能屏幕是9:16的,而这个最大分辨率是4:3的,这个时候预览的时候就会变形,图像发生扭曲。
为了达到最佳匹配,我们可以针对竖屏的时候,进行宽高转换,用来适配最佳分辨率,这里的宽高应该拿手机屏幕的实际宽高,而不是显示宽高,有虚拟键盘的时候,显示高度比实际高度小
public void initFromCameraParameters(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
if(Build.VERSION.SDK_INT>16){
DisplayMetrics dm = new DisplayMetrics();
manager.getDefaultDisplay().getRealMetrics(dm);
screenResolution = new Point(dm.widthPixels, dm.heightPixels); // 这里拿到的是屏幕的实际宽高
}else{
DisplayMetrics dm = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
method.invoke(display, dm);
screenResolution = new Point(dm.widthPixels, dm.heightPixels);
}catch(Exception e){
screenResolution = new Point(display.getWidth(), display.getHeight()); // 这里拿到的是屏幕的显示宽高
e.printStackTrace();
}
}
LogUtil.i(TAG, "屏幕分辨率宽高: " + screenResolution);
Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
if(screenResolution.x < screenResolution.y){ // 解决竖屏拉伸问题
screenResolutionForCamera.x = screenResolution.y;
screenResolutionForCamera.y = screenResolution.x;
LogUtil.i(TAG, "竖屏转换屏幕分辨率宽高: " + screenResolutionForCamera);
}
cameraResolution = findBestPreviewSizeValue(parameters, screenResolutionForCamera);
LogUtil.i(TAG, "相机的分辨率: " + cameraResolution);
}