要控制裁剪,必须控制图片大小和矩形大小。
这是非常重要的a)选择与预览相同宽高比的图片尺寸,然后b)确保屏幕上的预览不变形。如果您为各种设备准备应用程序,那么这两项任务都不是微不足道的。为了实现后者,您需要控制预览大小和表面视图尺寸。我已经更详细地解释了这一点别处 https://stackoverflow.com/questions/21668394/camera-in-android-how-to-get-best-size-preview-size-picture-size-view-size.
为了简单起见,我建议忽略可能具有自然横向方向的平板电脑。在手机上,即使将相机方向设置为纵向(仅影响预览),捕获的图像也会“旋转”90°。别指望设置旋转() https://developer.android.com/reference/android/hardware/Camera.Parameters.html#setRotation(int)为您解决此问题:根据书本,允许简单地为捕获的图像设置 EXIF 标志。
您设置的边距为查看Tamanho in px。这可能无法在各种屏幕上很好地扩展。我建议以编程方式设置此视图的尺寸,即预览表面的一定百分比。您可以使用支持库 https://developer.android.com/reference/android/support/percent/PercentRelativeLayout.html在 XML 中定义它,但恐怕这不会给你足够的控制权。
有了这些,假设我们有 1280×720 的预览,2560×1440 的图片,我们的屏幕是 1280×800,矩形位于中间,616×400 像素(或多或少是尺寸)从您的屏幕截图中缩放)。
屏幕上的实际预览尺寸可能是 1000x562,左右填充 79 像素的黑边。然后以下代码将生成预期的捕获图片:
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);
//.../
}