Android图片的裁剪

在开发的工作过程中图片的裁剪越来越重要,往往在设置个人信息的时候需要裁剪图片来设置头像,Android本身系统自带的图片裁剪功能为

Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");

下面是这几天研究的一些小列子:

1、图片裁切是Intent所需的一些配置信息:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT,null);
intent.setType("image/*");
intent.putExtra("aspectX",1);//裁剪比例
intent.putExtra("aspectY",1);
intent.putExtra("outputX",400);//输出比例
intent.putExtra("outputY",400);
intent.putExtra("Crop","true");//可裁剪
intent.putExtra("scale", true);//去除黑边
intent.putExtra("scaleUpIfNeeded", true);//去除黑边
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString();
intent.putExtra("noFaceDetection", true); // 不启用人脸识别

2、用已知的图片的Uri来获取图片数据并进行剪切显示:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(resultCode == RESULT_OK && requestCode == 1){

super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult: "+data.toString());
//拿到剪切数据
Bitmap bitmap = decodeUriAsBitmap(imageUri);//decode bitmap
//显示剪切图像
mImageView.setImageBitmap(bitmap);

}
}
private Bitmap decodeUriAsBitmap(Uri uri){
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
}

3、下面是一个完整的Demo

private ImageView mImageView;
private String [] type = {"拍照","相册"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.img_show);

}

public void btnClick(View view){
switch (view.getId()){
case R.id.btn_select:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("选择照片");
builder.setItems(type, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(which == 0){
startCameraPicCut(dialog);
}else if(which == 1){
ImageViewCrop(dialog);
}
}
}).show();
break;

}
}

private void startCameraPicCut(DialogInterface dialog){
dialog.dismiss();
//调用系统的拍照功能
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//下面这句指定调用相机拍照后的照片存储的路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(),
"xiaoma.jpg")));
startActivityForResult(intent, 2);
}
private void ImageViewCrop(DialogInterface dialog){
dialog.dismiss();
Intent intent = new Intent(Intent.ACTION_PICK, null);
/**
* 下面这句话,与其它方式写是一样的效果,如果:
* intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
* intent.setType(""image/*");设置数据类型
* 如果朋友们要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"
* 这个地方小马有个疑问,希望高手解答下:就是这个数据URI与类型为什么要分两种形式来写呀?有什么区别?
*/
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, 1);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(resultCode == RESULT_OK ){
switch (requestCode){
case 1:
startPhotoZoom(data.getData());
break;
case 2:
File temp = new File(Environment.getExternalStorageDirectory()
+ "/xiaoma.jpg");
startPhotoZoom(Uri.fromFile(temp));
break;
case 3:
if(data != null)
setPicToView(data);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
private void startPhotoZoom(Uri uri) {
/*
* 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页
* yourself_sdk_path/docs/reference/android/content/Intent.html
* 直接在里面Ctrl+F搜:CROP ,之前小马没仔细看过,其实安卓系统早已经有自带图片裁剪功能,
* 是直接调本地库的,小马不懂C C++ 这个不做详细了解去了,有轮子就用轮子,不再研究轮子是怎么
*
*/
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}
private void setPicToView(Intent picdata){
Bundle bundle = picdata.getExtras();
if(bundle != null){
Bitmap bitmap = bundle.getParcelable("data");
mImageView.setImageBitmap(bitmap);
}
}
}

4、xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.mypicturecrop.MainActivity">
<Button
android:id="@+id/btn_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="btnClick"
android:textSize="16sp"
android:text="选择图片"
android:padding="10dp"
android:layout_marginLeft="10dp"/>

<ImageView
android:id="@+id/img_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="100dp"/>
</LinearLayout>


5、上面所剪切到的图片为矩形,如果需要设置图片为圆形(比如:头像),可以在demo中添加如下代码

public Bitmap toRoundBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float roundPx;
float left,top,right,bottom,dst_left,dst_top,dst_right,dst_bottom;
if (width <= height) {
roundPx = width / 2;
top = 0;
bottom = width;
left = 0;
right = width;
height = width;
dst_left = 0;
dst_top = 0;
dst_right = width;
dst_bottom = width;
} else {
roundPx = height / 2;
float clip = (width - height) / 2;
left = clip;
right = width - clip;
top = 0;
bottom = height;
width = height;
dst_left = 0;
dst_top = 0;
dst_right = height;
dst_bottom = height;
}
Bitmap output = Bitmap.createBitmap(width,
height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect src = new Rect((int)left, (int)top, (int)right, (int)bottom);
final Rect dst = new Rect((int)dst_left, (int)dst_top, (int)dst_right, (int)dst_bottom);
final RectF rectF = new RectF(dst);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, src, dst, paint);
return output;
}
同时更改图片显示方法为:
private void setPicToView(Intent picdata){
Bundle bundle = picdata.getExtras();
if(bundle != null){
Bitmap bitmap = bundle.getParcelable("data");
bitmap = toRoundBitmap(bitmap);
mImageView.setImageBitmap(bitmap);
}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值