Android Camera开发分辨率 清晰度 图像变形

  • 设置了previewSize和pictureSize:
    但是通过打Log看出当时设置的时候分辨率是改变了的,然而正是拍照的时候分辨率又变回系统默认的了,在不同的机子上默认的分辨率不同。
  • setParameters failed 问题
  • 我的华为的默认的previewSize是最高的,然而pictureSize又是最低的:
    致预览的图片十分清晰,而拍出的照片十分小且模糊。
  • 同样使用默认分辨率,在一些机子上会出现预览变形的情况 

    1.设置预览分辨路和图片分辨率:

    Camera.Parameters param = camera.getParameters();
    param.setPreviewSize(width, height); //width一般大于height
         setParameters failed问题解决:
    param.setPictureSize(width, height);//width一般大于height
            setParameters failed问题解决:


    camera.setPerviewSize(screenWidth,screenHeight);// 不要这样设置,不然不会设置成功的;

    camera.setPerviewSize(screenHeight , screenWidth );//应该这样设置,第一个参数大于后面那个参数

     params.set("orientation", "landscape");//这样设置也可以

    camera.setDisplayOrientation(90);//相机旋转90度,便成竖屏

    camera.setParameters(param);//这句话不要忘记


    2. setParameters failed问题解决:

    java.lang.RuntimeException: setParameters failed
     at android.hardware.Camera.native_setParameters(Native Method)
     at android.hardware.Camera.setParameters(Camera.java:1834)


    3.width一般大于height,因为默认的摄像头是横向的,在我们预览的时候也要设置

    camera.setDisplayOrientation(90);


    4.预览变形解决:
    一般手机屏幕分辨率为16:9,而可能默认的预览分辨率是4:3的,
    然而我们在设置布局文件的时候设置的预览界面SurfaceView宽高均为match_parent,让预览界面充满屏幕,
    所以自然就会出现预览变形的情况。

    <SurfaceView
            android:id="@+id/surface_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"/>

    通过Context进行:

    WindowManager windowManager = mcontext.getWindowManager();
         Display display = windowManager.getDefaultDisplay();
         DisplayMetrics metrics = new DisplayMetrics();
         //获取屏幕的宽和高
         display.getMetrics(metrics);
         screenWidth = metrics.widthPixels;
         screenHeight = metrics.heightPixels;
    计算预览分辨率的宽高比:
    public String getSurfaceViewSize(int width, int height) {
            if (equalRate(width, height, 1.33f)) {
                return "4:3";
            } else {
                return "16:9";
            }
        }
    
        public boolean equalRate(int width, int height, float rate) {
            float r = (float)width /(float) height;
            if (Math.abs(r - rate) <= 0.2) {
                return true;
            } else {
                return false;
            }
        }

    根据分辨率设置SurfaceView的大小:
    
      /**
         * 根据分辨率设置预览SurfaceView的大小以防止变形
         *
         * @param surfaceSize
         */
        private void setSurfaceViewSize(String surfaceSize) {
            ViewGroup.LayoutParams params = surfaceView.getLayoutParams();
            if (surfaceSize.equals("16:9")) {
                params.height = ViewGroup.LayoutParams.MATCH_PARENT;
            } else if (surfaceSize.equals("4:3")) {
                params.height = 4 * screenWidth / 3;
            }
            surfaceView.setLayoutParams(params);
    


    这样基本就不会变形了,还有些手机可能既不是16:9也不是4:3 的屏幕分辨率,都可以通过计算比例适当缩放使其不变形。







  • 设置了previewSize和pictureSize,但是通过打Log看出当时设置的时候分辨率是改变了的,然而正是拍照的时候分辨率又变回系统默认的了,在不同的机子上默认的分辨率不同。
  • setParameters failed 问题
  • 我的华为的默认的previewSize是最高的,然而pictureSize又是最低的,导致预览的图片十分清晰,而拍出的照片十分小且模糊。
  • 同样使用默认分辨率,在一些机子上会出现预览变形的情况。
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Android Camera2 API设置相机分辨率的示例代码: 1. 首先,在您的AndroidManifest.xml文件中添加相机和相机权限: ``` <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.CAMERA" /> ``` 2. 在您的活动中实现相机回调和相机状态回调: ``` public class CameraActivity extends AppCompatActivity { private CameraManager cameraManager; private String cameraId; private CameraDevice cameraDevice; private CameraCaptureSession cameraCaptureSession; private CaptureRequest.Builder captureRequestBuilder; private ImageReader imageReader; private static final int IMAGE_WIDTH = 640; private static final int IMAGE_HEIGHT = 480; // ... private final CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { cameraDevice = camera; createCaptureSession(); } @Override public void onDisconnected(@NonNull CameraDevice camera) { cameraDevice.close(); } @Override public void onError(@NonNull CameraDevice camera, int error) { cameraDevice.close(); cameraDevice = null; } }; private final CameraCaptureSession.StateCallback captureSessionStateCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { cameraCaptureSession = session; updatePreview(); } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { Toast.makeText(CameraActivity.this, "Capture session failed", Toast.LENGTH_SHORT).show(); } }; // ... } ``` 3. 在您的活动的onCreate方法中获取相机管理器,并获取相机ID: ``` @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { cameraId = cameraManager.getCameraIdList()[0]; } catch (CameraAccessException e) { e.printStackTrace(); } // ... } ``` 4. 在您的活动中创建相机预览和图像读取器: ``` private void createPreview() { SurfaceTexture surfaceTexture = textureView.getSurfaceTexture(); surfaceTexture.setDefaultBufferSize(IMAGE_WIDTH, IMAGE_HEIGHT); Surface previewSurface = new Surface(surfaceTexture); Surface imageSurface = imageReader.getSurface(); try { captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(previewSurface); captureRequestBuilder.addTarget(imageSurface); cameraDevice.createCaptureSession(Arrays.asList(previewSurface, imageSurface), captureSessionStateCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private void createImageReader() { imageReader = ImageReader.newInstance(IMAGE_WIDTH, IMAGE_HEIGHT, ImageFormat.JPEG, 1); imageReader.setOnImageAvailableListener(imageReaderListener, null); } ``` 5. 在您的活动中更新相机预览: ``` private void updatePreview() { if (cameraDevice == null) { return; } captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); HandlerThread handlerThread = new HandlerThread("Preview"); handlerThread.start(); Handler handler = new Handler(handlerThread.getLooper()); try { cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, handler); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 6. 最后,在您的活动的onResume方法中打开相机并创建相机预览和图像读取器: ``` @Override protected void onResume() { super.onResume(); try { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { return; } cameraManager.openCamera(cameraId, cameraStateCallback, null); createPreview(); createImageReader(); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 注意:此示例代码仅适用于设置相机分辨率。如果您需要更多相机功能,例如对焦和曝光控制,请参考Camera2 API文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值