如何覆盖在相机拍摄的图像上的图像或视图

问题描述:

我在做什么是绘制从摄像机的图像上的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正处于图像的中间。 enter image description here

我捕捉上面的图像,它被保存。我去看它,它看起来像这样: enter image description here

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

作为另一个试验,我移动机器人部分地关闭屏幕如图中下一个相机预览 enter image description here

我捕捉图像是在上述中示出,并且在观看它时,机器人被精确地切断它是如何在预览窗口,但它又在左上角时,它应该是全屏 enter image description here

+0

如果你可以编辑Sandbox.java,你可以尝试创建一个getTransformedBitmap()方法。它只需要创建一个新的位图和一个新的Canvas,传递新的位图作为参数。然后在你的画布上调用draw()并返回位图。这可能比使用view.getDrawingCache()更好。 – thomas88wp 2013-03-07 01:06:04

+0

@ thomas88wp我一定读了你的评论一百次试图追随你。我将如何创建新的位图?你能为我详细一点吗?感谢你的帮助! – Badams 2013-03-07 05:27:08

+0

对不起,发表令人困惑的评论。看看你的截图,我将建议一些不同的解决方案和一些代码(见下文)。 – thomas88wp 2013-03-09 19:46:15

从相机检索位图将是巨大的(2000+像素宽)。您绘制图像的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人都被剪裁,这表明它只是一个简单的缩放问题。

希望有帮助!

+0

正是我需要的!谢谢! – Badams 2013-03-11 02:43:28

+0

嘿@Badams,你可以请分享代码.. :) – 2015-10-18 11:34:37