以编程方式裁剪位图的底部部分

时间:2016-08-19 08:27:35

标签: android

我有一个从相机中取出的位图。我想剪裁图像,使其只留下它的底部。裁剪后的图像应该比原始位图的高度减少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坐标,这样我就可以裁剪任何图像尺寸,并且只能获得底部部分。但有人能指出我如何从位图获取此坐标?或者我必须从布局本身中取出它吗?

3 个答案:

答案 0 :(得分:9)

我不熟悉位图上的操作,但是通过检查代码并查看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 :(得分:1)

请根据您的需要使用我的代码我希望它的工作

if (srcBmp.getWidth() >= srcBmp.getHeight()){

  dstBmp = Bitmap.createBitmap(
     srcBmp, 
     srcBmp.getWidth()/2 - srcBmp.getHeight()/2,
     0,
     srcBmp.getHeight(), 
     srcBmp.getHeight()
     );

}else{

  dstBmp = Bitmap.createBitmap(
     srcBmp,
     0, 
     srcBmp.getHeight()/2 - srcBmp.getWidth()/2,
     srcBmp.getWidth(),
     srcBmp.getWidth() 
     );
}

答案 2 :(得分:1)

我就是这样做的:

topcutoff是你想要在图像顶部切割的东西,而buttomcutoff在buttom上(如果需要的话)

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

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

这也可以解释一些事情:Google Bitmap Documentation

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