如何在Android中裁剪已知URI的图像?

4
我希望在ImageView中显示的图像可以选择特定部分(只需突出显示所选的部分,其他部分应为半透明),并且该部分也可以根据需要调整大小或由用户在触摸事件上完成。
现在,需要裁剪所选的图像部分,然后显示和保存已裁剪的图像。
编辑:
我使用意图打开图像并使用intent.putExtra("crop","true");进行裁剪。
但是,在传递意图时,我想打开已知URI的图像,而不是打开整个图像库相册。
有人能否建议如何通过意图传递来打开特定的URI以打开图像。
提前致谢。

1
@Nikki:所以,你需要做的是获取一些图像,裁剪其中的一部分(并保存它),然后使其余部分半透明? - Zelimir
@Zelimir:没错……对,我需要这么做,就像你刚刚解释的那样。 - Nikki
@Nikki:最简单的方法是使用Bitmap android.graphics.Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)从源位图创建一个新的位图。对于部分透明度,请使用XFer模式函数。 - Zelimir
@Zelimir:你能否举个例子来解释一下,因为我还没有完全理解。 - Nikki
@Zelimir:你能否给我提供一些例子?我无法做到动态选择图像部分,然后裁剪该部分图像并保存。你能帮我解决这个问题吗? - Nikki
显示剩余22条评论
4个回答

3
关于您问题的最后部分,如果您使用最新版本的Gingerbread(2.3.3,API level 10),您可以使用BitmapRegionDecoder来裁剪图像。这非常有用,因为在此API出现之前,您必须将整个图像加载到内存中才能进行裁剪。对于5mpix和8mpix相机来说,通常不可能进行裁剪而不进行子采样(即裁剪后的图像会丢失大量的分辨率)。

2

更新:在问题被编辑并更加准确地描述后,我修改了我的答案。

你遇到的问题已经有很长的历史了,也在stackoverflow上有相关讨论:

无法在Android中找到com.android.camera.CropImage activity

其中一个回答已经描述了你需要做的。请注意,你使用的intent不是官方SDK的一部分,你可能会遇到不同类型的问题。我遇到的问题是在相机拍摄图像后立即进行裁剪。此外,它在不同的Android版本之间不兼容,所以如果你在1.5上让它工作,可能在2.3上不起作用。其他有用的链接:

http://groups.google.com/group/android-developers/browse_thread/thread/2dd647523926192c/569f36b5b28f2661?lnk=gst&q=Crop+image+intent#569f36b5b28f2661

http://groups.google.com/group/android-developers/browse_thread/thread/2dd647523926192c/dcbe5aef29eddad6?lnk=gst&q=Crop+image+intent#dcbe5aef29eddad6

http://groups.google.com/group/android-developers/browse_thread/thread/d7b6a133c164aa17/184bf3b85da2ce58?lnk=gst&q=Crop+image+intent#184bf3b85da2ce58


1

看看我对这个问题的回答。它没有涉及到你问题中的触摸调整大小方面,但是处理了在原始图像上绘制部分图像的问题。

底线是,你不想使用ImageView,因为它主要用于显示具有各种缩放属性的静态图像。你最好使用一个自定义视图,并重写draw()方法。


但是如何裁剪该部分并保存图像的该部分? - Nikki
目前有没有解决这个问题的方案? - Asiimwe

0

裁剪图片

private void cropImage() {
    // Use existing crop activity.
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(capturedImageUri, IMAGE_UNSPECIFIED);

    // Specify image size
    intent.putExtra("outputX", IMAGE_DIMENSION);
    intent.putExtra("outputY", IMAGE_DIMENSION);

    // Specify aspect ratio, 1:1
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("scale", true);
    intent.putExtra("return-data", true);
    // REQUEST_CODE_CROP_PHOTO is an integer tag you defined to
    // identify the activity in onActivityResult() when it returns
    startActivityForResult(intent, REQ_CODE_CROP_PHOTO);
}

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