自定义相机视图

时间:2012-10-07 06:25:21

标签: android android-camera surfaceview

我在实施自定义相机视图方面遇到了困难。

我想要达到的任务是 - 在相机预览中,我得到了一张预览图片(在previewcallback功能中)。 我缩放它然后我想在相机视图中绘制图像的缩放版本。

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

我试图锁定表面视图,但它没有帮助。它返回null,因此我无法在该表面上绘制任何内容。

有什么建议吗? 感谢。

2 个答案:

答案 0 :(得分: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)配对,以形成全分辨率图片。

答案 1 :(得分:1)

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

坏消息是你不能在第一个框架布局的顶部放置另一个表面视图 (这是表面视图的限制,它们不能重叠),但好消息是你可以放置图像视图并在那里绘制你的位图(通过runOnuiThread()

您可以在我们的javaOCR project

中找到如何执行此操作的示例

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