【问题标题】:How to overlay an image or view on top of a camera captured image如何在相机捕获的图像上叠加图像或视图
【发布时间】:2013-02-22 00:46:48
【问题描述】:

我正在做的是将相机中的图像绘制到canvas 上,然后将包含图像的view 转换为bitmap 并将其绘制在画布上。然后将最终的bitmap 保存到外部存储中。

问题是canvas 似乎将自身调整为预览窗口大小,而不是保存的图像大小。

这是我的活动类中将捕获的视图合并到相机图像顶部的部分:

        Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
                imageData.length, options);
        Bitmap mutableBitmap = myImage.copy(Bitmap.Config.ARGB_8888, true);

        Paint paint = new Paint();
        Canvas canvas = new Canvas(mutableBitmap);

        view.setDrawingCacheEnabled(true);
        viewCapture = Bitmap.createBitmap(view.getDrawingCache());
        view.setDrawingCacheEnabled(false);
        canvas.drawBitmap(viewCapture, 0, 0, paint);

        fileOutputStream = new FileOutputStream(dir + "/" + imgName + ".jpg");

        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
        mutableBitmap.compress(CompressFormat.JPEG, quality, bos);

这会将位图保存在捕获的图像顶部,但由于大小不同,它会偏移到左上角。

我通过在我的 surfaceChanged 中执行以下操作来设置不同的大小

  Camera.Parameters p = mCamera.getParameters();
  Camera.Size myBestPreviewSize = getBestPreviewSize(w, h, p);
  p.setPreviewSize(myBestPreviewSize.width, myBestPreviewSize.height);
  Camera.Size myBestPictureSize = getBestPictureSize(w, h, p);
  p.setPictureSize(myBestPictureSize.width, myBestPictureSize.height);

显然,通过这样做,我获得了预览窗口的最佳分辨率和捕获图像的最佳分辨率。我相信这个问题是由两种不同的解决方案引起的,但要弄清楚为什么我被困在哪里。

希望以下图片能更好地描述问题:

此图像显示预览窗口。如您所见,Android 处于图像的中间。

我捕获了上面的图像并保存了它。我去查看它,这就是它的样子:

请注意,Android 不再位于中间,而是位于左上角。

作为另一项测试,我将 android 部分移出屏幕,如下一个相机预览所示

我完全按照上面所示的方式捕获图像,查看它时,android 被完全切断,就像它在预览窗口中一样,但它又在左上角,当它应该是全屏时

【问题讨论】:

  • 如果您可以编辑 Sandbox.java,您可以尝试创建一个 getTransformedBitmap() 方法。它只需要创建一个新的位图和一个新的画布,将新的位图作为参数传递。然后在画布上调用 draw() 并返回位图。这可能比使用 view.getDrawingCache() 更好。
  • @thomas88wp 我一定已经阅读了你的评论一百次试图关注你。我将从什么创建新的位图?你能为我详细说明一下吗?感谢您的帮助!
  • 对不起,令人困惑的评论。看看你的截图,我会用一些代码建议一个不同的解决方案(见下文)。

标签: java android eclipse image android-activity


【解决方案1】:

从相机中检索到的位图将会很大(2000+ 像素宽)。您绘制图像的 SurfaceView 仅与您的设备分辨率一样大(约 1000 像素宽)。当您将一个绘制到另一个上时,您需要对其进行缩放,否则它将最终变为应有大小的 1/2(如您的屏幕截图中所示)。以下是我将如何修改您的代码。

view.setDrawingCacheEnabled(true);
viewCapture = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
//Source Rect sized to the surface view.
Rect src = new Rect(0, 0, viewCapture.getWidth(), viewCapture.getHeight());
//Destination RectF sized to the camera picture
RectF dst = new RectF(0, 0, myImage.getWidth(), myImage.getHeight());
canvas.drawBitmap(viewCapture, src, dst, paint);

我知道您在设置相机参数和尺寸方面付出了一些努力,但要么不起作用,要么您需要采取不同的方法。不过,我认为这应该可行。您的第二张屏幕截图中,两个图像中都夹有 Android 家伙,这表明这只是一个简单的缩放问题。

希望有帮助!

【讨论】:

  • 正是我需要的!谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多