参考:
- http://www.cnblogs.com/rossoneri/p/3976530.html
- https://my.oschina.net/ryanhoo/blog/86842
- https://my.oschina.net/ryanhoo/blog/86865
一. 原理
- 通过Intent打开系统自带的剪裁Activity,通过Intent设置Extra参数,进行剪裁参数的设定。剪裁结果的缩略图会保存在返回的data中,而大图要通过Uri进行保存(其实就是保存到自己建的文件里面)。
二. 剪裁时候可以设置的参数及简介
这是一张偷来的图片
三. 返回缩略图的使用步骤
- 获取要剪裁的图片(可以通过相册选择,也可以通过相机拍照)PS:此处演示从相册选择(就是从相册选取图片,然后返回一个图片路径的Uri)
//打开相册 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, REQ_PIC);
//onActivityResult()里面获取选择的图片 if (requestCode == REQ_PIC) { mImageUri = data.getData(); crop();//获取到之后开始剪裁 }
- 设置剪裁Intent及参数
private void cropAndThumbnail(){ Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(mImageUri, "image/*");//设置要缩放的图片Uri和类型 intent.putExtra("aspectX", 768);//宽度比 intent.putExtra("aspectY", 1024);//高度比 intent.putExtra("outputX", 768);//输出图片的宽度 intent.putExtra("outputY", 1024);//输出图片的高度 intent.putExtra("scale", true);//缩放 intent.putExtra("return-data", false);//当为true的时候就返回缩略图,false就不返回,需要通过Uri intent.putExtra("noFaceDetection", false);//前置摄像头 startActivityForResult(intent, REQ_CROP);//打开剪裁Activity }
- startActivityForResult打开剪裁Activity
- 代码即为上面代码最后一句
- onActivityResult回调里面进行数据处理(缩略图保存在返回的Intent的Bundle里面,然后通过data键可以取出)
if (requestCode == REQ_CROP) { /*缩略图*/ if(data!=null){ Bundle bundle = data.getExtras(); Bitmap bitmap = bundle.getParcelable("data"); mImageView.setImageBitmap(bitmap); Log.i(TAG, "onActivityResult: smallUri "+mSmallUri); } }
四. 返回原图的使用步骤
原图太大,Android不会保存到内存里面去,所以也不会返回到调用的Activity中,因此需要通过Uri保存到外部文件中。
- 获取要剪裁的图片(可以通过相册选择,也可以通过相机拍照)
- 代码同上1
- 设置剪裁Intent及参数
private void crop() { /*新建用于存剪裁后图片的文件,并转化为Uri*/ File imageFile = createImageFile(); mSmallUri = Uri.fromFile(imageFile); Log.i(TAG, "crop: " + mSmallUri); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(mImageUri, "image/*"); intent.putExtra("aspectX", 768); intent.putExtra("aspectY", 1024); intent.putExtra("outputX", 768); intent.putExtra("outputY", 1024); intent.putExtra("scale", true); intent.putExtra("return-data", false);//设置为不返回缩略图 intent.putExtra(MediaStore.EXTRA_OUTPUT, mSmallUri);//设置大图保存到文件 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//保存的图片格式 intent.putExtra("noFaceDetection", false); startActivityForResult(intent, REQ_CROP); }
- startActivityForResult打开剪裁Activity
- 代码即为上面代码最后一句
- onActivityResult回调里面进行数据处理(文件对应的Uri)
try { if (mSmallUri != null) { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mSmallUri)); mImageView.setImageBitmap(bitmap); } else { Log.i(TAG, "onActivityResult: Uri is null"); } } catch (FileNotFoundException e) { e.printStackTrace(); }
五.源码
public class MainActivity extends AppCompatActivity {
private Button mButton;
private static final int REQ_CROP = 873;
private static final int REQ_PIC = 434;
private Uri mImageUri;
private ImageView mImageView;
private Uri mSmallUri;
private final String TAG = getClass().getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = findViewById(R.id.button);//点击从相册选取照片
mImageView = findViewById(R.id.imageView);//显示剪裁后的图片
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, REQ_PIC);
}
});
}
private void crop() {
/*新建用于存剪裁后图片的文件,并转化为Uri*/
File imageFile = createImageFile();
mSmallUri = Uri.fromFile(imageFile);
Log.i(TAG, "crop: " + mSmallUri);
/*File image = new File(getExternalCacheDir() + "/demo.jpg");
Log.i(TAG, "crop: path " + image.getAbsolutePath());
mSmallUri = Uri.fromFile(image);*/
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(mImageUri, "image/*");
intent.putExtra("aspectX", 768);
intent.putExtra("aspectY", 1024);
intent.putExtra("outputX", 768);
intent.putExtra("outputY", 1024);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);//设置为不返回缩略图
intent.putExtra(MediaStore.EXTRA_OUTPUT, mSmallUri);//设置大图保存到文件
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//保存的图片格式
intent.putExtra("noFaceDetection", false);
startActivityForResult(intent, REQ_CROP);
}
/*缩略图*/
private void cropAndThumbnail() {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(mImageUri, "image/*");//设置要缩放的图片Uri和类型
intent.putExtra("aspectX", 768);//宽度比
intent.putExtra("aspectY", 1024);//高度比
intent.putExtra("outputX", 768);//输出图片的宽度
intent.putExtra("outputY", 1024);//输出图片的高度
intent.putExtra("scale", true);//缩放
intent.putExtra("return-data", false);//当为true的时候就返回缩略图,false就不返回,需要通过Uri
intent.putExtra("noFaceDetection", false);//前置摄像头
startActivityForResult(intent, REQ_CROP);
}
/*用时间创建图片文件,防重名*/
private File createImageFile() {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File imageFile = null;
try {
imageFile = File.createTempFile(imageFileName, ".jpg", storageDir);
} catch (IOException e) {
e.printStackTrace();
}
return imageFile;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) {
return;
}
if (requestCode == REQ_PIC) {//选取图片
mImageUri = data.getData();
crop();
} else if (requestCode == REQ_CROP) {//剪裁
/*缩略图*/
/*if(data!=null){
Bundle bundle = data.getExtras();
Bitmap bitmap = bundle.getParcelable("data");
mImageView.setImageBitmap(bitmap);
Log.i(TAG, "onActivityResult: smallUri "+mSmallUri);
}*/
/*原图*/
try {
if (mSmallUri != null) {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mSmallUri));
mImageView.setImageBitmap(bitmap);
} else {
Log.i(TAG, "onActivityResult: Uri is null");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}