如何在适用于 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 游戏“欢迎回来”吐司?