0

我在实现自定义相机视图时遇到了困难。

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

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

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

有什么建议么?谢谢。

4

2 回答 2

2

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

但粗略地说,图像数据是 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) 配对,以形成全分辨率图像。
于 2012-10-08T07:17:58.523 回答
1

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

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

您可以在我们的javaOCR 项目中找到如何执行此操作的示例

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

于 2012-10-08T07:28:52.767 回答