Android自定义相机 – 在矩形内裁剪图像

我有一个自定义相机应用程序,它有一个居中的矩形视图,如下所示:

相机截图

当我拍照时,我想忽略矩形之外的所有东西。 该视图与我的XML视图中的Camera Preview或SurfaceView没有任何关联,如下所示:

        

有人可以帮我如何正确裁剪图像吗? 我试图基于我的XML创建一个新的Bitmap,但显然它不起作用,如:

 Camera.PictureCallback jpegCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { //.../ Bitmap imagemOriginal = BitmapFactory.decodeByteArray(data, 0, data.length); Bitmap imagemCortada = Bitmap.createBitmap(imagemOriginal, 70, 400, imagemOriginal.getWidth() - 70, imagemOriginal.getHeight() - 400); //.../ } 

我把这些初始值放在x和y上,并试图从宽度和高度中减去(基于来自View引用marginTop,Bottom等的XML值)但是我没有成功,因为我不知道如何match使用从Camera获取的图像坐标查看坐标。 另外,对我来说似乎Bitmap.createBitmap确实有限的裁剪,显然我不能直接裁剪为矩形。

要控制裁剪,您必须控制图片大小和矩形大小。

a)选择与预览具有相同宽高比的图片尺寸非常重要, b)确保预览不会在屏幕上失真。 如果您为各种设备准备应用程序,则这两项任务都不是一件容易的事。 要实现后者,您需要同时控制预览大小和SurfaceView大小。 我已在其他地方更详细地解释了这一点。

为了简单起见,我建议忽略可能具有自然横向方向的平板电脑。 在手机上,即使您将相机方向设置为纵向(仅影响预览),捕获的图像也将“旋转”90°。 不要指望setRotation()为你解决这个问题:通过本书,可以简单地为捕获的图像设置EXIF标志。

可以px中设置viewTamanho的边距。 这可能无法在各种屏幕上很好地扩展。 我建议以编程方式设置此视图的尺寸,作为预览曲面的特定百分比。 您可以使用支持库在XML中定义它,但我担心这不会给您足够的控制权。

有了这一切,让我们说我们有预览1280×720,图片2560×1440,我们的屏幕是1280×800,矩形在中间,616×400像素(这或多或少的大小从你的截图缩放)。

屏幕上的实际预览大小可能是1000×562,左右填充,黑色边距为79px。 然后,以下代码将生成预期捕获的图片:

 public void onPictureTaken(byte[] data, Camera camera) { //.../ Bitmap imagemOriginal = BitmapFactory.decodeByteArray(data, 0, data.length); // 2560×1440 float scale = 1280/1000F; int left = (int) scale*(imagemOriginal.getWidth()-400)/2; int top = (int) scale*(imagemOriginal.getHeight()-616)/2; int width = (int) scale*400; int height = (int) scale*616; Matrix rotationMatrix = new Matrix(); rotationMatrix.postRotate(90); Bitmap imagemCortada = Bitmap.createBitmap(imagemOriginal, left, top, width, height, rotationMatrix, false); //.../ }