我正在为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(); ListSupportedPreview = 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) - 全屏保持表面视图,这样就不会拉伸.
2) - 在具有完全不透明度的surfaceview上进行视图.所以看起来像相机已经被平方.
3) - 捕获图像或视频后,您将不得不裁剪它们.
对于视频,您必须使用一些视频处理库,如javacv.使用此库,您可以提取视频帧,将它们转换为位图,在方块中裁剪位图,然后重新编码为视频.
为了获得准确的结果,您需要根据需要使用不同的技术,例如在捕捉期间缩放相机等.
原始图片:
平方图像: