Android摄像头预览在方形屏幕上拉伸

时间:2015-12-09 10:20:37

标签: android android-camera surfaceview

我正在构建适用于Android的应用,但设备确实有方形屏幕。屏幕为320x320,相机应用程序使用SurfaceView显示预览,如下所示:

    mCameraView = (SurfaceView) findViewById(R.id.surface);
    LayoutParams params = mCameraView.getLayoutParams();
    int camera_dimension = getResources().getInteger(R.integer.camera_dimension);
    params.height = camera_dimension; //320px
    params.width = camera_dimension;

    mCameraView.setLayoutParams(params);
    mCameraViewHolder = mCameraView.getHolder();
    mCameraViewHolder.addCallback(this);
    mCameraViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

在Surface上更改了,我正在做这个并且它可以工作,但支持者预览是w480 x h320

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

    int mWidth = w;
    int mHeight = h;
    int mFormat = format;

    try {
        mCameraAccess.mCamera.stopPreview();
    } catch (Exception e){
        // ignore: tried to stop a non-existent preview
    }
    Camera.Parameters param = mCameraAccess.mCamera.getParameters();

    List<Camera.Size> SupportedPreview = param.getSupportedPreviewSizes();
    int ScreenSize = getResources().getInteger(R.integer.camera_dimension);

    for (int i = 0; i < SupportedPreview.size(); i++) {
        if (SupportedPreview.get(i).height == ScreenSize) {
            param.setPreviewSize(SupportedPreview.get(i).width, SupportedPreview.get(i).height);
            break;
        }
    }
    mCameraAccess.mCamera.setParameters(param);
    mCameraAccess.mCamera.startPreview();
}

如何确保我在视图中的预览不是压缩而是一种中心作用。由于预览是一个矩形,我只需要以图像为中心的正方形。通常我使用scaleType但在Surface视图中不支持

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

我想出的解决方案是:

  

1) - 全屏保持表面视图,这样就不会拉伸。

     

2) - 在具有完全不透明度的surfaceview上进行视图。所以看起来像相机已经被平方。

     

3) - 捕获图像或视频后,您将不得不裁剪它们。

     

对于视频,您必须使用一些视频处理库,如javacv。使用此库,您可以提取视频帧,将它们转换为位图,在方块中裁剪位图,然后重新编码为视频。

     

要获得准确的结果,您需要根据需要使用不同的技术,例如在捕捉过程中缩放相机等。

原始图片:

enter image description here

平方图像:

enter image description here