程序化地裁剪位图的底部部分

11

我有一张从相机中拍摄的位图。我想裁剪该图像,使其仅留下底部部分。裁剪后的图像应为原始位图高度的80%以下,因此我只希望左侧边缘开始的底部20%。

我在代码中明确执行此操作,没有使用任何Android裁剪意图。

以下是可视化我要实现的内容的图像:

crop this

我已经使用以下代码成功地裁剪了位图的顶部部分:

final Bitmap toBeCropped = BitmapFactory.decodeFile(mFile.getPath());

final BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inTargetDensity = 1;
toBeCropped.setDensity(Bitmap.DENSITY_NONE);

int fromHere = (int) (toBeCropped.getHeight() * 0.2);
Bitmap croppedBitmap = Bitmap.createBitmap(toBeCropped, 0, 0, toBeCropped.getWidth(), fromHere);
mPreviewHalf.setImageBitmap(croppedBitmap);

但是我找不到一种从顶部开始裁剪80%的方法。我考虑获取位图的y坐标,这样我可以裁剪任何图像大小并始终仅获取底部部分。但是有人能告诉我如何从位图中获取此坐标吗?或者我必须从布局本身获取它吗?

2个回答

17

我不熟悉对位图进行操作,但通过检查您的代码并查看API,我猜测您需要在下一行指定y坐标以匹配起始点:

Bitmap croppedBitmap = Bitmap.createBitmap(toBeCropped, 0, "here", toBeCropped.getWidth(), fromHere);

所以我猜应该是类似以下的东西:

Bitmap croppedBitmap = Bitmap.createBitmap(toBeCropped, 0, (toBeCropped.getHeight() * 0.8), toBeCropped.getWidth(), fromHere);

在这种情况下,fromHere 将定义您要裁剪的行数,而不是起始点(正如您所指出的那样,起始点为总行数的20%)


1
谢谢。这样做是正确的。我最初认为传递的坐标应该是布局的坐标。 - emen
5
没问题,有时候你只需要别人提供新的角度。特别是当你已经花太多时间看它了。这种情况我也常遇到! - HarryS
如果我想从顶部和底部裁剪图像...fromHere的值将是多少? - Nisarg patel

2
这是我的做法:

topcutoff是你想要在图像顶部裁剪的部分,而buttomcutoff则是在底部裁剪的部分(如果需要)。

height = height - topcutoff;
height = height - bottomcutoff;
croppedBitmap = Bitmap.createBitmap(croppedBitmap, 0, topcutoff, width, height);

基本上,您只需设置一个起始点(topcutoff),从该点开始显示位图。在您的情况下,这将是位图后80%的位置。

这可能也解释了一些问题:Google位图文档

"int:源中第一个像素的y坐标",因此可以确定您要开始显示图像的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接