如何在适用于 Android 的 Google API 的 CameraSource 中保存带有叠加层的图像?

Posted

技术标签:

【中文标题】如何在适用于 Android 的 Google API 的 CameraSource 中保存带有叠加层的图像?【英文标题】:How to save an image with an overlay on it in CameraSource from Google APIs for android? 【发布时间】:2016-07-14 19:12:37 【问题描述】:

我在 android 中使用谷歌 API 进行人脸检测。当检测到人脸时,我正在画布上绘制图像。我正在尝试通过单击按钮来捕获带有叠加层的图像。在方法中 public void onPictureTaken(byte[] bytes),字节只包含没有覆盖的图像。有没有办法保存带有叠加层的图像?

【问题讨论】:

我使用 this.getDrawingCache(); 从 GraphicOverlay 类中获取覆盖,但它总是返回相同的覆盖。例如,当我更改覆盖时,它总是返回第一个覆盖。另外,当图像被捕获时,它会旋转,有时旋转 90 度,有时旋转 -90 度。我得到的覆盖在正确的位置,所以当我把它放在图像上时它看起来不正确。 请记住,您需要管理三个不同的坐标系:(1) 预览图像坐标 - 这些是人脸检测器报告的坐标,(2) 绘制画布坐标 - 这些是用于绘制叠加层的坐标,(3) 图片图像坐标 - 与预览的不同之处在于它可能具有更高的分辨率。另请注意,如果您使用前置摄像头,预览/叠加层将水平翻转(镜像)。 点击捕获按钮时如何获得正确的叠加层? 如果您已经解决了这个问题,请发布解决方案。我想完成同样的任务。 我还没有找到解决方案。但是当我有更多空闲时间时,我会尽快开始工作。如果我找到任何解决方案,我会在这里发布。 【参考方案1】:

你必须

创建一个由新位图支持的新画布,

Bitmap picture = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Bitmap resizedBitmap = Bitmap.createBitmap(mGraphicOverlay.getWidth(),mGraphicOverlay.getHeight(),picture.getConfig());
Canvas canvas = new Canvas(resizedBitmap);

在其上绘制捕获的位图

在其上绘制叠加层 保存新位图

此外,为了使叠加层与捕获的图片匹配,您需要镜像图片或叠加层

Matrix matrix = new Matrix();

matrix.setScale((float)resizedBitmap.getWidth()/(float)picture.getWidth(),(float)resizedBitmap.getHeight()/(float)picture.getHeight());

// mirror by inverting scale and translating
matrix.preScale(-1, 1);
matrix.postTranslate(canvas.getWidth(), 0);

Paint paint = new Paint();
canvas.drawBitmap(picture,matrix,paint);

tracker.getmEyesGraphic().draw(canvas); // make those accessible

【讨论】:

最后一行的跟踪器是什么??

以上是关于如何在适用于 Android 的 Google API 的 CameraSource 中保存带有叠加层的图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Amazon Cognito 与适用于 Android 的 Google Plus 集成?

如何使用适用于 Android V2 的 Google Maps 处理地图移动端?

如何在适用于 Android 的 Google API 的 CameraSource 中保存带有叠加层的图像?

如何在 Unity3D 上显示适用于 Android 的 Google Play 游戏“欢迎回来”吐司?

如何使用适用于 android 的 google play 游戏服务实现后端服务器身份验证

适用于 Android 的 Google+ 登录 - Google 权限活动结果代码