參考:
- 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();
}
}
}
}