我们可以从这个答案中了解到解决此问题的一般方法。简要引用:
我的解决方案是首先将预览选择矩形缩放到本地相机图片大小。现在,我知道本地分辨率的哪个区域包含我想要的内容,我可以对本地分辨率上的矩形进行类似的操作,然后将该矩形缩放到实际由Camera.Parameters.setPictureSize捕获的较小图像。
现在,进入实际代码。执行缩放的最简单方式是使用Matrix。它有一个方法Matrix#setRectToRect(android.graphics.RectF, android.graphics.RectF, android.graphics.Matrix.ScaleToFit),我们可以像这样使用:
RectF previewRect = new RectF(0, 0, 480, 800),
pictureRect = new RectF(0, 0, 1080, 1920),
nativeResRect = new RectF(0, 0, 1952, 2592),
resultRect = new RectF(0, 0, 480, 800);
final Matrix scaleMatrix = new Matrix();
scaleMatrix.setRectToRect(previewRect, nativeResRect, Matrix.ScaleToFit.CENTER);
scaleMatrix.mapRect(resultRect);
scaleMatrix.setRectToRect(pictureRect, nativeResRect, Matrix.ScaleToFit.CENTER);
scaleMatrix.invert(scaleMatrix);
scaleMatrix.mapRect(resultRect);
经过所有这些操作,resultRect
将保存相机拍摄的图片中与您应用程序预览中看到的完全相同的图像对应的区域的坐标。 您可以通过BitmapRegionDecoder.html#decodeRegion(android.graphics.Rect,android.graphics.BitmapFactory.Options)方法从图片中裁剪此区域。
就是这样。