Android相机预览捕获/调整捕获的图像大小以匹配预览

时间:2015-04-22 23:13:20

标签: android image camera surfaceview

我正在尝试创建和应用程序,要求我拍摄以前捕获的图像并将其放在当前相机预览上,大约0.5 alpha。该“叠加”图像用作捕获下一张图像的指南;客户端将使用叠加层将预览中的当前帧与先前捕获的图像进行比较。解决此问题的一种简单方法是检索捕获的最后一个文件并将其设置为视图。但是,捕获的图像并不总是与相机预览的分辨率和宽高比相匹配,导致叠加和预览在对象的表示中不匹配(同一对象在预览和捕获的图像之间的大小可能不同)。我试过了:

  • 使用Camera Preview回调来存储当前帧数据,效率低下并且总是运行良好(也有轻微的转换,尺寸准确)
  • 使用前面提到的上一个文件方法并尝试相应地缩小或放大,匹配宽高比(也许我的数学错误[我使用预览的宽高比来计算原始图像中的区域],它是还是可以使用这种方法吗?如果有人可以参与其中,我们将不胜感激。)
  • 研究捕捉表面视图内容的方法,但无济于事。

目前,我想要了解我将如何处理的两种可能的方法是:

  • 以某种方式冻结SurfaceView(锁定某种画布),设置不透明度并使用另一个SurfaceView来显示相机(可能是效率低下,笨重的解决方法?)。
  • 在调用PictureCallback(首选)时捕获SurfaceView的内容并存储在位图中。

当然,任何其他建议都将不胜感激。

注意:有类似的问题,我花了几个小时来完成它们,但没有一个能正确解决我的问题或提供足够的细节。

1 个答案:

答案 0 :(得分:2)

我使用两个TextureView组件工作:

  • 一个设置为0.5 alpha并使用RelativeLayout放在另一个顶部。
  • 让不透明的TextureView注册SurfaceTextureListener
  • 启动由所述侦听器中的onSurfaceTextureAvailable触发的摄像头
  • 将给定的SurfaceTexture设置为previewTexture
  • 按下按钮,在透明TextureView
  • 的画布上绘制getBitmap()

Activity.java(实现SurfaceTextureListener):

@Override
public void onClick(View view) {
{
    Canvas canvas = alphaCameraTextureView.lockCanvas();
    canvas.drawBitmap( cameraTextureView.getBitmap(), 0, 0, null );
    alphaCameraTextureView.unlockCanvasAndPost( canvas );
}

@Override
public void onSurfaceTextureAvailable( SurfaceTexture surfaceTexture, int width, int height )
{
    try
    {
        camera = Camera.open();
        camera.setDisplayOrientation( 90 );
        camera.setPreviewTexture( surfaceTexture );
        camera.startPreview();
    }
    catch (IOException e ) { e.printStackTrace(); }
}

@Override
public boolean onSurfaceTextureDestroyed( SurfaceTexture surfaceTexture )
{
    camera.stopPreview();
    camera.release();
    return false;
}

layout.xml中的T​​extureViews:

<TextureView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/cameraTextureView"
    android:layout_weight="0"/>

<TextureView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/alphaCameraTextureView"
    android:alpha="0.5"
    android:layout_weight="0" />