14

我正在开发一个相机应用程序,基本上作为消息传递应用程序的一部分来附加图像等。该应用程序需要适用于 >= SDK 2.2 并且:

不能尽可能多地使用默认的 Android 相机,因为:

  1. 该应用程序的性质决定了永远不应将图像保存到磁盘,并且一些 OEM(三星)喜欢在不给您选择的情况下这样做。

  2. 我不能调用任何其他相机应用程序可以拦截的意图,因为那个应用程序可以保存图像。

我目前的问题是处理Android相机显然讨厌纵向的事实。具体来说,经过一番挖掘后,我正在监视显示,并在旋转时调用setDisplayOrientation(90). 这可行,但表面视图尺寸也需要更改,并且必须在支持的尺寸内完成,否则参数设置会使应用程序崩溃。

我正在使用我在此处找到的另一个 SO 片段(getBestPreviewSize()方法)来执行此操作,但它有一个明显的问题,我不敢相信我还没有发现其他人有。

生命周期的一部分takePicture涉及调用PostView图片回调。这是显示SurfaceView将通过 byteArray 返回到 raw 和/或 jpeg 回调的当前暂停图像的静止图像的内容。我的问题是,这张图片在少数看似随机的测试设备上仍然存在偏差!所以行为是用户以完美的 4:3 纵横比看到动态相机图像,直到他们拍摄照片并且呈现给他们的图像被压扁。请注意,字节数组本身是正确的,当我Bitmap在消息传递端点构造它时,它显示得很好,但这仍然是一个问题。

在这一点上,我看不到如何更改静止图像显示。谁能帮我这个?

4

3 回答 3

6

Android相机系统一团糟。并且被焊接到主板上,相机芯片不会喜欢肖像应用程序 - 所有回调都会在相机方向溢出数据(你收到的缓冲区实际上是与本机相机应用程序共享的内存片) - 如果你想在你的应用程序运行时显示它在肖像模式下,您必须将这些数据翻转过来xy

我不会在相机使用的表面视图上显示图像,而是用透明覆盖它ImageView并在那里绘制我的位图。

您可能(希望)在javaocr 项目中找到一些灵感,其中 android 守护进程以纵向模式工作并在实时预览中绘制位图。(请从 结帐git,因为它现在正在发布,我正在努力使用 git 和 maven,请参阅 demos 目录)

于 2012-10-15T11:01:40.653 回答
3

我怀疑你的问题在几个不同的层面。

传感器安装

首先,摄像头传感器安装在每个设备上的方式都不同。谷歌有样板代码用于获取该方向并设置正确的旋转值以在此处进行更正,这对 API 8 来说很好。

AR校正

第二个问题显然是预览帧与屏幕的纵横比不同。你可以使用这篇文章来解决这个问题。surfaceview 尺寸与最佳预览尺寸无关,这些值不必匹配 - 事实上,你的 AR 搞砸了证明它们不匹配。

预览帧大小!= 图片大小

最后,当您使用 takePicture 拍照时,图片的大小完全独立于预览帧的大小。使用以下查询和设置预览帧大小: setPreviewSize() / getSupportedPreviewSizes()

使用以下查询和设置图片大小(来自 takePicture()): getSupportedPictureSizes() / setPictureSize()

您可能会幸运地使用某些设备,图片和预览帧的默认设置将是相同的。并非所有设备都如此。

最后,如果要显示拍摄的图片,如果它与 SurfaceView 的大小不同,则可能还需要对其进行 AR 校正。或者,您可以将其绘制到 ImageView 并使用ScaleType.CENTER_INSIDE来保持纵横比。

于 2012-10-16T04:53:58.937 回答
0

查看有关如何将 QR 扫描仪切换为纵向的帖子:http ://code.google.com/p/zxing/issues/detail?id=178 。我不知道这是否与您将图片交换为肖像有关,但也许它提供了一些指导。评论#11 似乎是最有帮助的。(我不赞成从 Sean Owen 那里窃取 QR 应用程序代码)。

于 2012-10-15T14:17:24.700 回答