如何覆盖在相机拍摄的图像上的图像或视图
我在做什么是绘制从摄像机的图像上的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不再位于中间,它位于左上角。
作为另一个试验,我移动机器人部分地关闭屏幕如图中下一个相机预览
我捕捉图像是在上述中示出,并且在观看它时,机器人被精确地切断它是如何在预览窗口,但它又在左上角时,它应该是全屏
从相机检索位图将是巨大的(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人都被剪裁,这表明它只是一个简单的缩放问题。
希望有帮助!
正是我需要的!谢谢! – Badams 2013-03-11 02:43:28
嘿@Badams,你可以请分享代码.. :) – 2015-10-18 11:34:37
如果你可以编辑Sandbox.java,你可以尝试创建一个getTransformedBitmap()方法。它只需要创建一个新的位图和一个新的Canvas,传递新的位图作为参数。然后在你的画布上调用draw()并返回位图。这可能比使用view.getDrawingCache()更好。 – thomas88wp 2013-03-07 01:06:04
@ thomas88wp我一定读了你的评论一百次试图追随你。我将如何创建新的位图?你能为我详细一点吗?感谢你的帮助! – Badams 2013-03-07 05:27:08
对不起,发表令人困惑的评论。看看你的截图,我将建议一些不同的解决方案和一些代码(见下文)。 – thomas88wp 2013-03-09 19:46:15