Java 如何将图像或视图覆盖在相机捕获图像的顶部

Java 如何将图像或视图覆盖在相机捕获图像的顶部,java,android,eclipse,image,android-activity,Java,Android,Eclipse,Image,Android Activity,我正在做的是将相机中的图像绘制到画布上,然后将包含图像的视图转换为位图,并将其绘制在画布上。最后的位图保存到外部存储器中 问题是画布似乎正在根据预览窗口大小调整自身大小,而不是保存的图像大小 以下是“我的活动”类中将捕获的视图合并到相机图像顶部的部分: Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); Bi

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

问题是
画布
似乎正在根据预览窗口大小调整自身大小,而不是保存的图像大小

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

        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完全按照预览窗口中的方式被切断,但当它应该全屏显示时,它仍然位于左上角

从相机检索到的位图将是巨大的(2000+px宽)。您绘制图像的SurfaceView仅与设备分辨率(约1000px宽)一样大。当你把一个画到另一个上时,你需要缩放它,否则它会变成它应该大小的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的家伙被截取在两张图片中,这表明这只是一个简单的缩放问题


希望有帮助

如果可以编辑Sandbox.java,可以尝试创建getTransformerDBitMap()方法。它只需要创建一个新位图和一个新画布,并将新位图作为参数传递。然后在画布上调用draw()并返回位图。这可能比使用view.getDrawingCache()效果更好。@thomas88wp我一定已经读了你的评论一百遍了,试图跟上你。我将从什么创建新位图?你能给我再详细解释一下吗?谢谢你的帮助!很抱歉让人困惑。看看你们的截图,我将用一些代码建议一个不同的解决方案(见下文)。这正是我所需要的!非常感谢。