Android选取相机、相册图片进行裁剪,并更新UI

demo源码:

效果图:

界面非常的简单,只有一个imageView,通过点击该ImageView,从相册中选取照片,或拍照,将得到的照片按要求进行裁剪,然后将裁剪后的照片更新到ImageView中。

现在,,来看一下工程的xml,和.java文件:

有两个xml文件,main.xml是进入app时的主页面,有一个ImageViewselect_pic_layout.xml是点击ImageView之后弹出来的框,一共有3个button,从中可以选择是从相机中获取图片还是相册中获取图片

来看下详细代码: main.xml:

==”#F3F1DA”android:orientation=”vertical” ><LinearLayout==”center”android:orientation=”horizontal” ><TextView==<RelativeLayout===”5dip” ><ImageView==”centerCrop”android:src=”@drawable/mini_avatar” /><TextView===></LinearLayout>

select_pic_layout.xml:

===”vertical” ><LinearLayout===”vertical” ><Button====”bold” /><Button====”bold” /><Button=====>

MainActivity.java:

import java.io.File;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.util.DisplayMetrics;import android.util.Log;import android.view.View;import android.view.Window;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;/** * * @author Liuzhipeng (316910444@qq.com) Create at 2015-4-30 上午11:14:31 */.view.View.OnClickListener {private ImageView faceImage;REQUEST_PHOTO = 1;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题setContentView(R.layout.main);faceImage = (ImageView) findViewById(R.id.face);// 设置事件监听faceImage.setOnClickListener(this);}(View arg0) {// TODO Auto-generated method stubswitch (arg0.getId()) {case R.id.face:Intent intent = new Intent(this, SelectPicActivity.class);startActivityForResult(intent, REQUEST_PHOTO);break;default:break;}}(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubif(resultCode==Activity.RESULT_OK){switch (requestCode) {case REQUEST_PHOTO:Log.e(“PhotoClip”, “aaaaaaaaaa”);if (data != null) {byte[] bis = data.getByteArrayExtra(“bitmap”);Bitmap bm = BitmapFactory.decodeByteArray(bis, 0, bis.length);faceImage.setImageBitmap(bm);}default:break;}}super.onActivityResult(requestCode, resultCode, data);}}

SelectPicActivity.java:

import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import android.app.Activity;import android.content.ContentValues;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.Toast;/** * @author 刘志鹏<br> *Email :316910444@qq.com<br> *QQ: 316910444<br> * @version 创建时间 2015-4-30 上午11:33:03 */{/**** 使用照相机拍照获取图?*/SELECT_PIC_BY_TACK_PHOTO = 1;/**** 使用相册中的图片*/SELECT_PIC_BY_PICK_PHOTO = 2;private LinearLayout dialogLayout;private Button takePhotoBtn, pickPhotoBtn, cancelBtn;// MainActivity中跳转到SelectPicActivity的Intentprivate Intent lastIntent;PHOTO_REQUEST = 1;CAMERA_REQUEST = 2;PHOTO_CLIP = 3;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.select_pic_layout);initView();}/*** 初始化加载View*/() {dialogLayout = (LinearLayout) findViewById(R.id.dialog_layout);dialogLayout.setOnClickListener(this);takePhotoBtn = (Button) findViewById(R.id.btn_take_photo);takePhotoBtn.setOnClickListener(this);pickPhotoBtn = (Button) findViewById(R.id.btn_pick_photo);pickPhotoBtn.setOnClickListener(this);cancelBtn = (Button) findViewById(R.id.btn_cancel);cancelBtn.setOnClickListener(this);// 得到在MainActivity中的IntentlastIntent = getIntent();}(View v) {switch (v.getId()) {case R.id.dialog_layout:finish();break;case R.id.btn_take_photo:// 调用摄像头getPicFromCamera();break;case R.id.btn_pick_photo:// 从相册中获取图片getPicFromPhoto();break;default:finish();break;}}() {Intent intent = new Intent(Intent.ACTION_PICK, null);intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,”image/*”);startActivityForResult(intent, PHOTO_REQUEST);}() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 下面这句指定调用相机拍照后的照片存储的路径intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), “test.jpg”)));startActivityForResult(intent, CAMERA_REQUEST);}(MotionEvent event) {finish();return super.onTouchEvent(event);}(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case CAMERA_REQUEST:switch (resultCode) {case -1:// -1表示拍照成功// 得到刚刚拍照的照片File file = new File(Environment.getExternalStorageDirectory()+ “/test.jpg”);if (file.exists()) {// 对图片进行裁剪,传入该文件的UriphotoClip(Uri.fromFile(file));}break;default:break;}break;case PHOTO_REQUEST:if (data != null) {photoClip(data.getData());}break;case PHOTO_CLIP:// 图片裁剪完之后if (data != null) {Bundle extras = data.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable(“data”);//将Bitmap转换为Byte[]通过Bundle传到MainActivityByteArrayOutputStream baos = new ByteArrayOutputStream();//对图片进行压缩,第二个参数为压缩的百分比,100为不压缩photo.compress(Bitmap.CompressFormat.JPEG, 100, baos);byte[] bitmapByte = baos.toByteArray();lastIntent.putExtra(“bitmap”, bitmapByte);//跳回到MainActivity,调用OnActivityResult()setResult(Activity.RESULT_OK, lastIntent);finish();// faceImage.setImageBitmap(photo);}}break;default:break;}}(Uri uri) {// 调用系统中自带的图片剪裁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”, 7);intent.putExtra(“aspectY”, 4);// outputX outputY 是裁剪图片宽高intent.putExtra(“outputX”, 315);intent.putExtra(“outputY”, 180);// 如果为true,会返回bitmap,通过data.getExtras().getParcelable(“data”);获取intent.putExtra(“return-data”, true);startActivityForResult(intent, PHOTO_CLIP);}}

基本上注释都写得很清楚了,还有一伙的话,大家可以下载demo运行一下。

demo源码:

闹里有钱,静处安身。

Android选取相机、相册图片进行裁剪,并更新UI

相关文章:

你感兴趣的文章:

标签云: