zoukankan      html  css  js  c++  java
  • 解决自定义相机分辨率适配、扭曲的问题

    在自定义相机和扫码的时候,如果不设置相机的默认分辨率,有可能导致相机用的是最小的分辨率,照出来的照片很模糊。

    所以自定义相机的时候,需要获取屏幕分辨率,相机的预览分辨率,进行最佳的匹配。

    由于相机的预览分辨率几乎都是 按照横屏的来描述的,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);
    }
  • 相关阅读:
    排序二——交换排序
    桥接模式 Bridge
    外观模式Facade(解耦)
    装饰模式和代理模式的区别
    代理模式 proxy
    装饰器模式 Decorator
    适配器模式
    android launcher-启动过程
    ubuntu 编译openwrt
    Eclipse Memory Analyzer tool(MAT)
  • 原文地址:https://www.cnblogs.com/lucktian/p/7560892.html
Copyright © 2011-2022 走看看