1

背景

我正在开发一个应用程序,在某些时候它有一个巨大的位图,它需要在上面使用人脸检测,所以我使用FaceDetector API

问题

人脸检测 API 对其输入位图有限制:

  1. 位图配置必须是 Config.RGB_565(写在这里
  2. 位图宽度必须是偶数(写在这里

我做了什么

因为我以后需要原始位图,所以我将它存储到一个文件中。

在那之后,我回收了原始位图,并从文件中加载了一个临时的,具有正确的配置,但遗憾的是,它并不总是有效,因为我需要使用均匀的宽度,而原始位图并不总是有一个均匀的宽度。

我试过告诉面部检测 API 使用“width-1”作为宽度,但它没有用。它说“java.lang.IllegalArgumentException:位图大小与初始化不匹配”。我什至不明白为什么它需要如此奇怪的宽度限制,以及如果它已经有了位图,为什么它需要宽度和高度的参数......

问题

我应该怎么办?

是否可以使其与奇数宽度位图一起使用,并且可能忽略一整列像素?

我问这个的原因是因为位图非常大,如果我将它克隆到一个具有相似大小(宽度均匀)的新位图,我可以很容易地在某些设备上获得 OOM。

我知道我可以使用 JNI 进行扩展(类似于我前段时间在这里写的一篇文章),但我希望我能找到一种更好、更少硬核的方式来实现同样的目标。

如果没有其他办法,也许android有一个可以提供帮助的JNI函数?

4

1 回答 1

0

这可用于将位图转换为所需格式(位图必须为 565 格式)。

位图 mFaceBitmap = bitmapImage.copy(Bitmap.Config.RGB_565, true); bitmapImage.recycle(); // 如果你想尽快释放内存

并改变宽度,你可以尝试类似

mFaceBitmapWidth = mFaceBitmap.getWidth(); mFaceBitmap.setWidth(mFaceBitmapWidth - 1);

于 2015-05-31T06:15:52.787 回答