Мы можем узнать об общем подходе к этой проблеме в этом ответе. Короткая цитата:
Мое решение состояло в том, чтобы сначала масштабировать прямоугольник выбора предварительного просмотра до собственного размера изображения камеры. Затем, теперь, когда я знаю, какая область собственного разрешения содержит нужный мне контент, я могу выполнить аналогичную операцию, чтобы затем масштабировать этот прямоугольник в исходном разрешении до меньшего изображения, которое фактически было снято для Camera.Parameters.setPictureSize.
Теперь к самому коду. Самый простой способ выполнить масштабирование — использовать Matrix. Он имеет метод Matrix#setRectToRect(android.graphics.RectF, android.graphics.RectF, android.graphics.Matrix.ScaleToFit), который мы можем использовать следующим образом:
// Here previewRect is a rectangle which holds the camera's preview size,
// pictureRect and nativeResRect hold the camera's picture size and its
// native resolution, respectively.
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();
// create a matrix which scales coordinates of preview size rectangle into the
// camera's native resolution.
scaleMatrix.setRectToRect(previewRect, nativeResRect, Matrix.ScaleToFit.CENTER);
// map the result rectangle to the new coordinates
scaleMatrix.mapRect(resultRect);
// create a matrix which scales coordinates of picture size rectangle into the
// camera's native resolution.
scaleMatrix.setRectToRect(pictureRect, nativeResRect, Matrix.ScaleToFit.CENTER);
// invert it, so that we get the matrix which downscales the rectangle from
// the native resolution to the actual picture size
scaleMatrix.invert(scaleMatrix);
// and map the result rectangle to the coordinates in the picture size rectangle
scaleMatrix.mapRect(resultRect);
После всех этих манипуляций resultRect
будет содержать координаты области внутри снимка, сделанного камерой, которые соответствуют точно такому же изображению, которое вы видели в превью вашего приложения. Вы можете вырезать эту область из изображения с помощью BitmapRegionDecoder.html#decodeRegion(android.graphics.Rect, android.graphics.BitmapFactory.Options).
Вот и все.
person
aga
schedule
24.06.2014