Android裁剪圆形头像源码
2014-12-08 17:50
316 查看
最近项目上要加一个小功能,裁剪图片生成圆形头像。我参考资料写了个小demo,大家可以参考一下。下面是代码,不难,容易有坑的地方稍微加了下注释。
package com.example.cutpicturedemo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import java.io.File;
public class MainActivity extends Activity implements View.OnClickListener {
private ImageView photo;
private final int REQUEST_CODE_CAMERA = 1;
private final int REQUEST_CODE_GALLERY = 2;
private final int REQUEST_CODE_CUT_PHOTO = 3;
private final int ACTION_CODE_CAMERA = -1;
private final int ACTION_CODE_GALLERY = -2;
private final String PHOTO_TEMP_PATH = "/Img/photo.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.photo = ((ImageView) findViewById(R.id.photo));
this.photo.setOnClickListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_CAMERA:
File localFile = new File(Environment.getExternalStorageDirectory()
+ MainActivity.this.PHOTO_TEMP_PATH);
if(localFile.exists()){
cutPhoto(Uri.fromFile(localFile));
}
break;
//下面两种情况需要检查下data为空的情况
case REQUEST_CODE_GALLERY:
if (data != null) {
cutPhoto(data.getData());
}
break;
case REQUEST_CODE_CUT_PHOTO:
if (data != null) {
setPhoto(data);
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
private void showPickDialog() {
PickPhotoListener mPickPhotoListener = new PickPhotoListener();
new AlertDialog.Builder(this)
.setTitle("更换头像")
.setMessage("选择图片")
.setPositiveButton("相机", mPickPhotoListener)
.setNegativeButton("图库", mPickPhotoListener)
.create()
.show();
}
public Bitmap getCirclePhoto(Bitmap paramBitmap) {
Bitmap localBitmap = Bitmap.createBitmap(paramBitmap.getWidth(),
paramBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas localCanvas = new Canvas(localBitmap);
Paint localPaint = new Paint();
Rect localRect = new Rect(0, 0, paramBitmap.getWidth(),
paramBitmap.getHeight());
localPaint.setAntiAlias(true);
localPaint.setFilterBitmap(true);
localPaint.setDither(true);
localCanvas.drawARGB(0, 0, 0, 0);
localCanvas.drawCircle(paramBitmap.getWidth() / 2,
paramBitmap.getHeight() / 2, paramBitmap.getWidth() / 2,
localPaint);
//这个是利用了ProterDuffXfermode裁剪图片
localPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
localCanvas.drawBitmap(paramBitmap, localRect, localRect, localPaint);
return localBitmap;
}
@Override
public void onClick(View paramView) {
showPickDialog();
}
public void cutPhoto(Uri paramUri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(paramUri, "image/*")
.putExtra("crop", "true")
.putExtra("aspectX", 1)
.putExtra("aspectY", 1)
/*这里注意一下,输出图片的大小要控制一下
* 300 300指的是像素
* 因为输出数据是通过Intent传输的
* 大小控制在360*360以内,但是太小图片就模糊了,建议在150~350之间
*/
.putExtra("outputX", 300)
.putExtra("outputY", 300)
.putExtra("return-data", true);
startActivityForResult(intent, MainActivity.this.REQUEST_CODE_CUT_PHOTO);
}
public void setPhoto(Intent paramIntent) {
Bundle localBundle = paramIntent.getExtras();
if (localBundle != null) {
Bitmap localBitmap = (Bitmap) localBundle.getParcelable("data");
this.photo.setImageBitmap(getCirclePhoto(localBitmap));
// this.photo.setImageBitmap(localBitmap);
File localFile = new File(Environment.getExternalStorageDirectory()
+ MainActivity.this.PHOTO_TEMP_PATH);
if (localFile.exists()){
localFile.delete();
Log.v("delete photo", "down");
}
}
}
private class PickPhotoListener implements DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface paramDialogInterface, int actionCode) {
if (actionCode == MainActivity.this.ACTION_CODE_CAMERA) {
paramDialogInterface.dismiss();
Intent intent = new Intent(
"android.media.action.IMAGE_CAPTURE");
intent.putExtra("output", Uri.fromFile(new File(
Environment.getExternalStorageDirectory(),
MainActivity.this.PHOTO_TEMP_PATH)));
MainActivity.this.startActivityForResult(intent, MainActivity.this.REQUEST_CODE_CAMERA);
}
if (actionCode == MainActivity.this.ACTION_CODE_GALLERY) {
paramDialogInterface.dismiss();
Intent intent = new Intent("android.intent.action.PICK",
null);
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
MainActivity.this.startActivityForResult(intent, MainActivity.this.REQUEST_CODE_GALLERY);
}
}
}
}
源码我就不上传了,就这一个Activity,Layout就只有一个ImageView子元素。
package com.example.cutpicturedemo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import java.io.File;
public class MainActivity extends Activity implements View.OnClickListener {
private ImageView photo;
private final int REQUEST_CODE_CAMERA = 1;
private final int REQUEST_CODE_GALLERY = 2;
private final int REQUEST_CODE_CUT_PHOTO = 3;
private final int ACTION_CODE_CAMERA = -1;
private final int ACTION_CODE_GALLERY = -2;
private final String PHOTO_TEMP_PATH = "/Img/photo.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.photo = ((ImageView) findViewById(R.id.photo));
this.photo.setOnClickListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_CAMERA:
File localFile = new File(Environment.getExternalStorageDirectory()
+ MainActivity.this.PHOTO_TEMP_PATH);
if(localFile.exists()){
cutPhoto(Uri.fromFile(localFile));
}
break;
//下面两种情况需要检查下data为空的情况
case REQUEST_CODE_GALLERY:
if (data != null) {
cutPhoto(data.getData());
}
break;
case REQUEST_CODE_CUT_PHOTO:
if (data != null) {
setPhoto(data);
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
private void showPickDialog() {
PickPhotoListener mPickPhotoListener = new PickPhotoListener();
new AlertDialog.Builder(this)
.setTitle("更换头像")
.setMessage("选择图片")
.setPositiveButton("相机", mPickPhotoListener)
.setNegativeButton("图库", mPickPhotoListener)
.create()
.show();
}
public Bitmap getCirclePhoto(Bitmap paramBitmap) {
Bitmap localBitmap = Bitmap.createBitmap(paramBitmap.getWidth(),
paramBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas localCanvas = new Canvas(localBitmap);
Paint localPaint = new Paint();
Rect localRect = new Rect(0, 0, paramBitmap.getWidth(),
paramBitmap.getHeight());
localPaint.setAntiAlias(true);
localPaint.setFilterBitmap(true);
localPaint.setDither(true);
localCanvas.drawARGB(0, 0, 0, 0);
localCanvas.drawCircle(paramBitmap.getWidth() / 2,
paramBitmap.getHeight() / 2, paramBitmap.getWidth() / 2,
localPaint);
//这个是利用了ProterDuffXfermode裁剪图片
localPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
localCanvas.drawBitmap(paramBitmap, localRect, localRect, localPaint);
return localBitmap;
}
@Override
public void onClick(View paramView) {
showPickDialog();
}
public void cutPhoto(Uri paramUri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(paramUri, "image/*")
.putExtra("crop", "true")
.putExtra("aspectX", 1)
.putExtra("aspectY", 1)
/*这里注意一下,输出图片的大小要控制一下
* 300 300指的是像素
* 因为输出数据是通过Intent传输的
* 大小控制在360*360以内,但是太小图片就模糊了,建议在150~350之间
*/
.putExtra("outputX", 300)
.putExtra("outputY", 300)
.putExtra("return-data", true);
startActivityForResult(intent, MainActivity.this.REQUEST_CODE_CUT_PHOTO);
}
public void setPhoto(Intent paramIntent) {
Bundle localBundle = paramIntent.getExtras();
if (localBundle != null) {
Bitmap localBitmap = (Bitmap) localBundle.getParcelable("data");
this.photo.setImageBitmap(getCirclePhoto(localBitmap));
// this.photo.setImageBitmap(localBitmap);
File localFile = new File(Environment.getExternalStorageDirectory()
+ MainActivity.this.PHOTO_TEMP_PATH);
if (localFile.exists()){
localFile.delete();
Log.v("delete photo", "down");
}
}
}
private class PickPhotoListener implements DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface paramDialogInterface, int actionCode) {
if (actionCode == MainActivity.this.ACTION_CODE_CAMERA) {
paramDialogInterface.dismiss();
Intent intent = new Intent(
"android.media.action.IMAGE_CAPTURE");
intent.putExtra("output", Uri.fromFile(new File(
Environment.getExternalStorageDirectory(),
MainActivity.this.PHOTO_TEMP_PATH)));
MainActivity.this.startActivityForResult(intent, MainActivity.this.REQUEST_CODE_CAMERA);
}
if (actionCode == MainActivity.this.ACTION_CODE_GALLERY) {
paramDialogInterface.dismiss();
Intent intent = new Intent("android.intent.action.PICK",
null);
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
MainActivity.this.startActivityForResult(intent, MainActivity.this.REQUEST_CODE_GALLERY);
}
}
}
}
源码我就不上传了,就这一个Activity,Layout就只有一个ImageView子元素。
相关文章推荐
- Android自定义控件实例,圆形头像(图库 + 裁剪+设置),上传头像显示为圆形,附源码
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
- Android圆形头像设置(实现相机、相册选择并裁剪)兼容6.0/7.0
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
- android圆形头像:相机裁剪+相册选择
- Android基于PhotoView实现的头像/圆形裁剪控件
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
- Android之圆形头像(实现相机拍摄+相册选择+图片裁剪功能)
- 超实用的Andoird圆形头像设置 —— 实现相机、相册选择并裁剪尽在一行代码之间(兼容Android6.0/7.0)
- Android之圆形头像(实现相机拍摄+相册选择+图片裁剪功能)
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
- Quartz2D裁剪圆形头像
- 《Android开发卷——设置圆形头像,Android截取圆形图片》
- android 头像选择以及裁剪
- Android裁剪固定大小头像的功能
- android头像相册/拍照选取,裁剪及上传综合案例
- Android实现类似换QQ头像功能(图片裁剪)
- Android 笔记 - 圆形头像
- Android裁剪图片为圆形图片
- PHP+jQuery+jCrop在线上传裁剪头像(内含源码)