如何在相机捕获的图像上叠加图像或视图

2022-09-04 23:14:40

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

问题是似乎正在调整自身的大小以预览窗口大小,而不是保存的图像大小。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);

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

我通过在表面更改中执行以下操作来设置不同的大小

  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处于图像的中间。enter image description here

我捕获上面的图像并将其保存。我去看它,这是它看起来的样子:enter image description here

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

作为另一项测试,我将Android部分移离了屏幕,如下一个相机预览所示enter image description here

我完全按照上面所示捕获图像,并且在查看它时,android被完全切断了它在预览窗口中的样子,但是当它应该是全屏时,它再次出现在左上角。enter image description here


答案 1

从相机中检索到的位图将是巨大的(2000+ px宽)。用于绘制图像的 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家伙被剪辑在两张图片中,这表明这只是一个简单的缩放问题。

希望有所帮助!


答案 2

推荐