【问题标题】:Android Camera Preview on a square screen stretched方形屏幕上的 Android 相机预览拉伸
【发布时间】:2015-12-09 10:20:36
【问题描述】:

我正在为 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();
}

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

有什么想法吗?

【问题讨论】:

    标签: android android-camera surfaceview


    【解决方案1】:

    我想出的解决办法是:

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

    2)-在表面视图上放置一个完全不透明的视图。所以看起来相机已经成正方形了。

    3)-捕获图像或视频后,您必须对其进行裁剪。

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

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

    原图:

    平方图像:

    【讨论】: