提取Android系统的图片剪切程序CropImage

原文:http://www.zhaoweihua.name/android-cropimage-149.html

有时候我们开发的应用中需要图片剪切功能,比如提供联系人头像选择并剪切上传,或许很多人实现起来会比较繁琐,这里我提取了Android系统自带的剪切功能,和直接通过Intent方式调用系统Camera程序的方式比起来,这个会具有更好的兼容性。先看截图:

首先还是先说下怎样通过Intent直接调用系统的图片剪切功能,在android1.6及以前的系统中,可以通过以下代码以startActivityForResult方式发送一个特定的Intent,然后在onActivityResult接收返回的图片数据:

 Android 图片剪切

Intent intent =newIntent("com.android.camera.action.CROP");
intent.setClassName("com.android.camera","com.android.camera.CropImage");File file =newFile(filePath);Uri uri =Uri.fromFile(file);
intent.setData(uri);
intent.putExtra("crop","true");
intent.putExtra("aspectX",1);
intent.putExtra("aspectY",1);
intent.putExtra("outputX",96);
intent.putExtra("outputY",96);
intent.putExtra("noFaceDetection",true);
intent.putExtra("return-data",true);
startActivityForResult(intent, REQUEST_CROP_ICON);

在Android1.6系统之后,uri不让传file:///了,只能传图库中的图片:

Intent intent =newIntent("com.android.camera.action.CROP");
intent.setData(data.getData());//data是图库选取文件传回的参数
intent.putExtra("crop","true");
intent.putExtra("aspectX",1);
intent.putExtra("aspectY",1);
intent.putExtra("outputX",96);
intent.putExtra("outputY",96);
intent.putExtra("noFaceDetection",true);
intent.putExtra("return-data",true);
startActivityForResult(intent, REQUEST_CROP_ICON);

这两只方式都是通过startActivityForResult方式来获取数据返回的,在onActivityResult中可以通过下面代码来得到返回经过剪切处理的图片数据:

//先判断是否为RESULT_OK,然后再判断REQUEST_CROP_ICON,代码省略。Bundle extras = data.getExtras();if(extras !=null){Bitmap photo = extras.getParcelable("data");ByteArrayOutputStream stream =newByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG,75, stream);//将流写入文件或者直接使用}

现在来看看对CropImage提取后的项目结构:

CropImage demo

CropImage demo


整个图片剪切功能的实现代码在crop包下,ImageCropActivity.java为测试应用的启动界面,CropUtil.java为工具类,代码的主要逻辑是先点击按钮,然后从相册选择一张图片,再调用剪切程序进行剪切并获取处理后的数据(也可以将存储卡中的任意图片格式的文件直接传给剪切程序进行处理),这里有几点要注意的:
1.在AndroidMainfast文件中注册activity :

 

<activityandroid:name="name.zhaoweihua.crop.CropImage"/><!--注意包名需与你的项目一直-->

2.添加对应的存储卡读写权限,一般相机拍摄的照片像素都比较高,在图片处理前先对图片大小和质量进行了压缩处理,以避免网络上传中耗费太大流量,以及图片操作内存溢出的可能性,如果不需要,大家可以在代码中去除相关代码。

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

3.另外,注意修改布局文件cropimage.xml中View的路径和项目中包的路径一致:

<viewclass="name.zhaoweihua.crop.CropImageView"android:id="@+id/image"android:background="#55000000"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_x="0dip"android:layout_y="0dip"/>

接下来就是代码使用,直接通过文件File来构造Uri然后传给Intent,再startActivityForResult,和Android1.6版调用系统剪切功能类似:

//调用CropImage类对图片进行剪切Intent intent =newIntent(this, name.zhaoweihua.crop.CropImage.class);Bundle extras =newBundle();
extras.putString("circleCrop","true");
extras.putInt("aspectX",200);
extras.putInt("aspectY",200);//这里的File文件可以是通过系统相册选取的,也可以是位于存储卡中任何一副图片文件
intent.setDataAndType(Uri.fromFile(f),"image/jpeg");
intent.putExtras(extras);
startActivityForResult(intent, PHOTO_CROP_DATA);

然后从onActivityResult中获取数据,这里就不多说了,大家可以下载项目代码研究。
测试项目下载CropImage

posted @ 2012-08-07 10:37  Hecker385  阅读(5980)  评论(2编辑  收藏  举报