安卓相机预览在正方形屏幕上的拉伸显示问题

5

我正在为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 view。

有什么想法吗?

1个回答

5
我想到的解决方案是:

1)使surface view全屏显示,这样它就不会拉伸。

2)在surface view上面放置一个视图,并设置完全透明度。这样看起来就像相机已经被框定了。

3)拍摄图像或视频后,您需要将它们裁剪成正方形。

对于视频,您需要使用一些视频处理库,例如javacv。使用此库,您可以提取视频帧,将其转换为位图,将位图裁剪成正方形,然后重新编码为视频。

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

原始图像:

enter image description here

正方形图像:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接