2012-10-07 73 views
0

我在实现自定义摄像头视图时遇到困难。自定义摄像头视图

我想要实现的任务是 - 在相机预览中我有一个预览图片(在previewcallback函数中)。 我放大它,然后我想在相机视图中绘制图像的缩放版本。

在previewcallback函数中,我将图像像素值作为字节数组获取。但是在canvas.drawImage中,它接受int数组。任何人都可以建议我像素数据组织在previewcallback函数内的字节数组中吗?

我试图锁定surfaceview,但它没有帮助。它返回null,所以我不能在该表面上绘制任何东西。

有什么建议吗? 谢谢。

回答

1

如前所述,NV21是默认设置,必须始终提供 - 这意味着您可以依赖它,如果您希望与其他设备兼容,则可以依靠它。至于锁定表面视图 - 您用于预览的表面视图对于您来说是不受限制的,因为它已经被相机应用锁定(这是本机并在自己的进程中运行) - 如果您想使用它,您将不得不停止预览它使相机应用程序释放此表面(希望)

坏消息是,您不能将第一个顶部的表面视图与框架布局 (这是表面视图的限制,它们不能重叠),但良好消息是,你可以将图像视图oevr它有画位图(通过runOnuiThread()

你可以找到例子,如何做到这一点在我们的javaOCR project

(请参阅android demo,请使用git repo,因为它是最新的)

+0

我的猜测和你的相似。该表面视图已被本机相机进程锁定。 所以,我试图使用第二种方法并失败(SurfaceView over SurfaceView);因为它不能正常工作。 我认为根据您的建议可以通过使用ImageView复制类似的效果。感谢那些信息,我会尽力而为。 – fadedreamz

2

来自预览回调的像素数据的组织方式取决于您的预览格式设置为什么。默认情况下,它是NV21,这是Android设备中兼容性最高的选项。例如,您可以找到有关此格式here的更多详细信息。

但是粗略地说,图像数据是YCbCr格式 - 不是画布想要的更常见的RGB颜色编码。你需要

  1. 转换将YCbCr字节值到RGB值(公式可以在Wikipedia找到)
  2. 上取样Cb和Cr(颜色)渠道进入全分辨率;它们已经缩小到Y(亮度)通道的宽度和高度的1/2。最简单的选择是使用最近邻居上采样 - 对4个不同的Y值使用相同的Cb和Cr值。所以你可以将Cb和Cr通道的像素(0,0)与Y通道的像素(0,0),(1,0),(0,1)和(1,1)配对以形成全分辨率图像。
+0

感谢您的信息,我将首先尝试使用YCbCr转换为RGB转换公式。 – fadedreamz

相关问题