我的应用程序中有一个带有正方形预览的相机,该预览不是真正的正方形-可以适合整个屏幕,但是有一个叠加层(相机工具栏)使它看起来像正方形。拍摄图像时,我希望它获取图像中预览中显示的正方形,而不是完整预览。
我找到了一种将位图裁剪为正方形的方法:
private static Bitmap cropToSquare(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int newWidth = (height > width) ? width : height;
int newHeight = (height > width)? height - ( height - width) : height;
int cropW = (width - height) / 2;
cropW = (cropW < 0)? 0: cropW;
int cropH = (height - width) / 2;
cropH = (cropH < 0)? 0: cropH;
return Bitmap.createBitmap(bitmap, cropW, cropH, newWidth, newHeight, matrix, true);
}
此问题是,它会从预览的底部(用户看不到)开始生成正方形图像。我希望它从相机工具栏的顶部开始,因为这是预览的开始位置。假设我们有一个高度cameraToolbarHeight
-如何修改该高度以从该高度而不是0开始裁剪?
我知道我使用的createBitmap(....)
方法具有x和y参数(在本例中为cropW和cropH),用于开始裁剪,但是我发现每个大于0的值都添加为参数产生错误:
java.lang.IllegalArgumentException: y + height must be <= bitmap.height()
如果我输入一个负数,则表示y不能为负。我的尝试是使用额外的参数int cropHFrom
(代表预览叠加层顶部的y坐标)修改上述方法,然后将其传递到createBitmap(...)
而不是cropH
中(当然我得到上面的错误)。
非常感谢您的帮助。