介紹
安卓自帶了裁剪功能,使用起來也簡單,主要屬性如下:
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(photoUri,"image/*");
intent.putExtra("crop","true");//發(fā)送裁剪信號,去掉也能進行裁剪
intent.putExtra("scale",true);// 去黑邊,是否保存比例
intent.putExtra("scaleUpIfNeeded",true);// 去黑邊
intent.putExtra("aspectX",2);
intent.putExtra("aspectY",1);
intent.putExtra("outputX",800);
intent.putExtra("outputY",400);
intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
intent.putExtra(MediaStore.EXTRA_OUTPUT,saveUri);
intent.putExtra("circleCrop",false);//字面意思是圓形的裁剪框。但是目測也需要手機的支持。
intent.putExtra("return-data",false);
intent.putExtra("noFaceDetection",false);//取消人臉識別
說明一
在使用過程中需要申請讀寫的權(quán)限
說明二
intent.putExtra("aspectX",2);
intent.putExtra("aspectY",1);
上述兩個屬性控制裁剪框的縮放比例。
當用戶用手拉伸裁剪框時候,裁剪框會按照上述比例縮放。
intent.putExtra("outputX",800);
intent.putExtra("outputY",400);
上述兩個屬性控制裁剪完畢,保存的圖片的大小格式。
哪怕上述裁剪框你按照1:1的比例來裁剪的,那么最后成像也是800*400,按照2:1的樣式保存,
所以說,裁剪框就是個參考。
如果不想要這些規(guī)規(guī)矩矩,那么就不用添加這些屬性。那么裁剪框以及報錯的成像都按照用戶手動操作的
來保存成圖片的。
說明三
intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
intent.putExtra(MediaStore.EXTRA_OUTPUT,saveUri);
這兩個屬性第一個是控制裁剪完的圖片保存的格式
第二個是裁剪完的圖片保存的路徑
錯誤:在7.0以上系統(tǒng)裁剪完畢之后,會提示“無法保存經(jīng)過裁剪的圖片”
這是因為,我們在7.0以上跨文件傳輸uri時候,需要用FileProvider,但是這里需要用
Uri.fromFile(file)生成的,而不是使用FileProvider.getUriForFile
說明四
intent.setDataAndType(photoUri,"image/*");
關(guān)鍵屬性
表明你要裁剪的的圖片的uri ,關(guān)鍵是7.0以后的uri獲?。?/p>
private Uri getUri(String path){
File file = new File(path);
Uri uri = null;
if (Build.VERSION.SDK_INT >= 24) {
try {
uri = FileProvider.getUriForFile(ShenPiXiangXiActivity.this
, PictureManager.getFileProviderName(ShenPiXiangXiActivity.this)
, file);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
ToastUtils.showShort("獲取文件路徑失敗");
}
} else {
uri = Uri.fromFile(file);
}
return uri;
}
說明五
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
添加此屬性是為了解決:調(diào)用裁剪框時候提示:圖片無法加載或者加載圖片失敗或者無法加載此圖片
說明六
intent.putExtra("spotlightX", 1.1f);//X軸方向的抽屜式壁紙選擇框
intent.putExtra("spotlightY", 2.1f);//Y軸方向的抽屜式壁紙選擇框
intent.putExtra("showWhenLocked",true); //默認false,不知道啥意思
不明覺厲,不知啥意思
說明七
intent.putExtra("set-as-wallpaper",true);
默認是false,當你弄成true的時候,你就會發(fā)現(xiàn)打開不是裁剪的,而是設(shè)置為壁紙的操作。
說明八
介紹一組可選屬性,通過上面描述,可以知道,用戶將需要裁剪的圖片uri和保存的uri傳遞過去,就好了,當裁減完畢返回來時候,resultCode = RESUK_OK,那么就可以進行相應的操作了!
但是如果想要返回來bitmap,則需要進行下面的兩個屬性操作:
intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("return-data",true);
那么就會有Bitmap返回:
if (data != null && data.getParcelableExtra("data") != null) {
mStream = new ByteArrayOutputStream();
mBitmap = data.getParcelableExtra("data");
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, mStream);
/**圖片可以應用了*/
/**接下來就是上傳到服務器*/
File files = creatFile(mBitmap);//變成文件
...后續(xù)根據(jù)需要來...
}
注意
需要bitmap的好像是圖片不能太大,要不然內(nèi)存占有過大!
參考
http://www.itdecent.cn/p/c6271f5dad46
https://segmentfault.com/q/1010000005070720/a-1020000005071373