参考:
一. 原理
通过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", pressFormat.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", pressFormat.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();
}
}
}
}