Bad*_*ams 11 java eclipse android image android-activity
我正在做的是将图像从相机绘制到a canvas,然后将view包含图像的图像转换为a 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);
Run Code Online (Sandbox Code Playgroud)
这会将位图保存在捕获的图像之上,但由于尺寸不同,它会偏移到左上角.
我通过在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);
Run Code Online (Sandbox Code Playgroud)
显然,通过这样做,我获得了预览窗口的最佳分辨率,以及捕获图像的最佳分辨率.我认为这个问题是由两个不同的决议引起的,但弄清楚为什么我会陷入困境.
希望以下图片能更好地描述问题:
此图像显示预览窗口.正如您所看到的,Android处于图像的中间位置.
我捕获上面的图像并保存.我去看它,这就是它的样子:

请注意,Android不再位于中间位置,位于左上角.
作为另一个测试,我将android部分移出屏幕,如下一个相机预览所示
我完全按照上面所示捕获图像,并且在查看它时,android会在预览窗口中完全切断,但是当它应该是全屏时,它再次位于左上角

从相机检索到的位图将会很大(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);
Run Code Online (Sandbox Code Playgroud)
我知道您在设置相机参数和尺寸方面做了一些努力,但要么不起作用,要么您需要采取不同的方法。不过,我认为这应该有效。你的第二个屏幕截图中,Android 人在两张图片中都被剪掉,表明这只是一个简单的缩放问题。
希望有帮助!
| 归档时间: |
|
| 查看次数: |
3853 次 |
| 最近记录: |