如何在安卓手机上裁剪图片?

35

可能是重复问题:
如何在Android中剪裁解析后的图像?

我在我的res/drawable文件夹中有一张图片,我想在将其加载到ImageView中时剪裁(即切出图片的一部分)。然而,我不确定该如何做,请问有什么建议吗?


链式问题的答案并没有回答如何裁剪,请仔细阅读。 - m0skit0
我发现最好的图片裁剪库是Android-Image-Cropper。请参考这个答案 - Soon Santos
5个回答

40

Bitmap.createBitmap:

从指定源位图的子集返回一个不可变位图。新位图可能是与原始位图相同的对象,也可能是已复制的副本。它的密度与原始位图相同。

将一个位图传递给它,并定义创建新位图的矩形范围。

// Take 10 pixels off the bottom of a Bitmap
Bitmap croppedBmp = Bitmap.createBitmap(originalBmp, 0, 0, originalBmp.getWidth(), originalBmp.getHeight()-10);

1
对我而言,只有当我使用 originalBmp.getWidth()-1 时才有效。似乎所有的裁剪尺寸都必须完全落在原始图像内,否则将返回原始图像。 - Jannie Theunissen
这应该很容易,可以被接受。 - buradd

13

Android联系人管理器EditContactActivity使用Intent("com.android.camera.action.CROP")

这是一个示例代码:

Intent intent = new Intent("com.android.camera.action.CROP");
// this will open all images in the Galery
intent.setDataAndType(photoUri, "image/*");
intent.putExtra("crop", "true");
// this defines the aspect ration
intent.putExtra("aspectX", aspectY);
intent.putExtra("aspectY", aspectX);
// this defines the output bitmap size
intent.putExtra("outputX", sizeX);
intent.putExtra("outputY", xizeY);
// true to return a Bitmap, false to directly save the cropped iamge
intent.putExtra("return-data", false);
//save output image in uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

1
如果我有一个位于SD卡/ myimage.jpg的图像,我该如何将URI放入CROP意图中?即,我想裁剪SD卡/ myimage.jpg图像的某个区域。 - Nguyen Minh Binh
#Nguyen,你有没有看到你评论的内容。 - Abdul Wahab
@rds, 我可以使用上述代码裁剪图像,但是相机裁剪活动仍在我的应用程序之外运行,当用户在裁剪意图中按下保存或取消时,如何结束它? - Abdul Wahab
当然它可以在你的应用程序之外运行。阅读Intent:1.它在处理“com.android.camera.action.CROP”的应用程序中运行。2.输出保存在您指定的“uri”中。最后一件事:使用“startActivityForResult”启动此活动,以了解用户是否按下了“确定”或“取消”。 - rds
这种方法意味着您必须拥有访问文件夹的权限,在KTI KAT及更高版本中需要添加文档权限。如果我没记错的话。 - Zapnologica

7

试试这个:

ImageView ivPeakOver=(ImageView) findViewById(R.id.yourImageViewID);

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.yourImageID);
int width=(int)(bmp.getWidth()*peakPercent/100);
int height=bmp.getHeight();

Bitmap resizedbitmap=Bitmap.createBitmap(bmp,0,0, width, height);
ivPeakOver.setImageBitmap(resizedbitmap);

来自文档:

static Bitmap    createBitmap(Bitmap source, int x, int y, int width, int height)

从源位图的指定子集返回一个不可变的位图。

不错!虽然不能通过ImageView上的简单属性完成,但我想这应该足够高效了。 - Olof Hedman

6
如果你想等比例裁剪图像的外侧部分,你需要查看ImageView的ScaleType属性:http://developer.android.com/reference/android/widget/ImageView.ScaleType.html 其中,你会对“centerCrop”选项感兴趣。它会裁剪掉大于定义大小的图像部分。
以下是在XML布局中实现此操作的示例:
<ImageView  android:id="@+id/title_logo"
            android:src="@drawable/logo"
            android:scaleType="centerCrop" android:padding="4dip"/>

他们只添加了中心裁剪而没有更多的裁剪选项,这太傻了。 - Olof Hedman

4
 int targetWidth = 100;
 int targetHeight = 100;
 RectF rectf = new RectF(0, 0, 100, 100);//was missing before update
 Bitmap targetBitmap = Bitmap.createBitmap(
 targetWidth, targetHeight,Bitmap.Config.ARGB_8888);
 Canvas canvas = new Canvas(targetBitmap);
 Path path = new Path();
 path.addRect(rectf, Path.Direction.CW);
 canvas.clipPath(path);
 canvas.drawBitmap(
 sourceBitmap,
 new Rect(0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight()),
 new Rect(0, 0, targetWidth, targetHeight),
 null);
 ImageView imageView = (ImageView)findViewById(R.id.my_image_view);
 imageView.setImageBitmap(targetBitmap);

1
你设置了矩形“rectf”的路径,但没有定义它。如何计算剪辑矩形的尺寸以正确地剪辑位图的中心?即不要从角落剪辑出去。 - MarkPowell
使用Bitmap.createBitmap的方法来处理源图像应该更加高效,除非您需要进一步修改位图。由于它创建了一个不可变的位图,因此它不必进行复制。(除非源是可变的) - Olof Hedman
什么是rectf?请回复。 - MD TAHMID HOSSAIN
这段代码适用于缩放图像而不是裁剪! - Mayur R. Amipara
http://www.coderzheaven.com/2011/03/15/crop-an-image-in-android/ - Swapnil Kadam

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