.java
1 package com.jerry.crop; 2 3 import java.io.File; 4 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.graphics.Bitmap; 8 import android.net.Uri; 9 import android.os.Bundle; 10 import android.os.Environment; 11 import android.provider.MediaStore; 12 import android.view.View; 13 import android.widget.ImageView; 14 import android.widget.Toast; 15 16 public class MainActivity extends Activity { 17 18 private static final int PHOTO_REQUEST_CAREMA = 1;// 拍照 19 private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择 20 private static final int PHOTO_REQUEST_CUT = 3;// 结果 21 22 private ImageView iv_image; 23 24 /* 头像名称 */ 25 private static final String PHOTO_FILE_NAME = "temp_photo.jpg"; 26 private File tempFile; 27 28 @Override 29 protected void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 setContentView(R.layout.activity_main); 32 this.iv_image = (ImageView) this.findViewById(R.id.iv_image); 33 } 34 35 /* 36 * 从相册获取 37 */ 38 public void gallery(View view) { 39 // 激活系统图库,选择一张图片 40 Intent intent = new Intent(Intent.ACTION_PICK); 41 intent.setType("image/*"); 42 // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY 43 startActivityForResult(intent, PHOTO_REQUEST_GALLERY); 44 } 45 46 /* 47 * 从相机获取 48 */ 49 public void camera(View view) { 50 // 激活相机 51 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 52 // 判断存储卡是否可以用,可用进行存储 53 if (hasSdcard()) { 54 tempFile = new File(Environment.getExternalStorageDirectory(), 55 PHOTO_FILE_NAME); 56 // 从文件中创建uri 57 Uri uri = Uri.fromFile(tempFile); 58 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 59 } 60 // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA 61 startActivityForResult(intent, PHOTO_REQUEST_CAREMA); 62 } 63 64 /* 65 * 剪切图片 66 */ 67 private void crop(Uri uri) { 68 // 裁剪图片意图 69 Intent intent = new Intent("com.android.camera.action.CROP"); 70 intent.setDataAndType(uri, "image/*"); 71 intent.putExtra("crop", "true"); 72 // 裁剪框的比例,1:1 73 intent.putExtra("aspectX", 1); 74 intent.putExtra("aspectY", 1); 75 // 裁剪后输出图片的尺寸大小 76 intent.putExtra("outputX", 250); 77 intent.putExtra("outputY", 250); 78 79 intent.putExtra("outputFormat", "JPEG");// 图片格式 80 intent.putExtra("noFaceDetection", true);// 取消人脸识别 81 intent.putExtra("return-data", true); 82 // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT 83 startActivityForResult(intent, PHOTO_REQUEST_CUT); 84 } 85 86 /* 87 * 判断sdcard是否被挂载 88 */ 89 private boolean hasSdcard() { 90 if (Environment.getExternalStorageState().equals( 91 Environment.MEDIA_MOUNTED)) { 92 return true; 93 } else { 94 return false; 95 } 96 } 97 98 @Override 99 protected void onActivityResult(int requestCode, int resultCode, Intent data) {100 if (requestCode == PHOTO_REQUEST_GALLERY) {101 // 从相册返回的数据102 if (data != null) {103 // 得到图片的全路径104 Uri uri = data.getData();105 crop(uri);106 }107 108 } else if (requestCode == PHOTO_REQUEST_CAREMA) {109 // 从相机返回的数据110 if (hasSdcard()) {111 crop(Uri.fromFile(tempFile));112 } else {113 Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!", 0).show();114 }115 116 } else if (requestCode == PHOTO_REQUEST_CUT) {117 // 从剪切图片返回的数据118 if (data != null) {119 Bitmap bitmap = data.getParcelableExtra("data");120 this.iv_image.setImageBitmap(bitmap);121 }122 try {123 // 将临时文件删除124 tempFile.delete();125 } catch (Exception e) {126 e.printStackTrace();127 }128 129 }130 131 super.onActivityResult(requestCode, resultCode, data);132 }133 }
.xml
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 tools:context=".MainActivity" > 7 8 <Button 9 android:layout_width="wrap_content"10 android:layout_height="wrap_content"11 android:onClick="gallery"12 android:text="获取图库图片" />13 <Button14 android:layout_width="wrap_content"15 android:layout_height="wrap_content"16 android:onClick="camera"17 android:text="拍照获取图片" />18 19 <ImageView20 android:id="@+id/iv_image"21 android:layout_width="wrap_content"22 android:layout_height="wrap_content" />23 24 </LinearLayout>
效果图: