在《Android相機、相冊擷取圖檔顯示并儲存到SD卡》中說明了在直接調用Android相機拍照時傳回Bitmap所引發的一個問題。今天,把在上篇附上的Demo加強了一下,增加了截圖的功能。具體需求是:拍照或相冊選取完畢後,先進入系統裁剪界面,裁剪完畢後再顯示或儲存圖檔,下面看下截圖部分所要調用的代碼:
//截取圖檔
public void cropImage(Uri uri, int outputX, int outputY, int requestCode){
//裁剪圖檔意圖
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
//裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//裁剪後輸出圖檔的尺寸大小
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
//圖檔格式
intent.putExtra("outputFormat", "JPEG");
intent.putExtra("noFaceDetection", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, requestCode);
}
例如,從相冊選擇圖檔後先調用裁剪功能代碼如下:
Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);
openAlbumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(openAlbumIntent, REQUEST_CODE);
接下來在onActivityResult裡面對裁剪後的圖檔進行處理,調用上面的cropImage()方法,将URI傳入,500是指定裁剪後圖檔的尺寸,最後一個參數為辨別碼:
Uri uri = data.getData();
cropImage(uri, 500, 500, CROP_PICTURE);
處理裁剪後的圖檔就和之前一樣,這裡隻貼出代碼片段僅供參考:
case CROP_PICTURE:
Bitmap photo = null;
Uri photoUri = data.getData();
if (photoUri != null) {
photo = BitmapFactory.decodeFile(photoUri.getPath());
}
if (photo == null) {
Bundle extra = data.getExtras();
if (extra != null) {
photo = (Bitmap)extra.get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);
}
}
iv_image.setImageBitmap(photo);
break;
在制作這個Demo中發現一個問題,由于在處理拍照顯示和裁剪這個過程中,我采取的方法是先将拍照後的圖檔儲存在SD卡,然後再取出來進行處理,直接拍照并顯示沒有出現問題,但在拍照後裁剪時,發現每次傳入裁剪界面的圖檔都是之前第一次拍的,進入SD卡也檢查了,存放的臨時圖檔也确實是我剛拍攝的,但是顯示的卻始終是之前第一次拍的,這裡迷惑到我了。索性沒有去管了,先解決問題再說(希望發現這個問題的朋友能提出改進方法)。既然在裁剪時我傳入的圖檔名字都一樣,那幹脆就換一個名字,是以我每次用System.currentTimeMillis()來作為臨時圖檔檔案名,顯示或處理完成後,再将該臨時檔案删除。Demo中還附上了一個關于圖檔和SD卡操作的工具類ImageTools.java作為贈品。最後功能還是實作了,但是還有很大的優化空間。先提出問題,感興趣的同學可以下載下傳Demo并改進,後續我會繼續整理一些Demo然後開源到Github上,歡迎大家持續支援、改進。
界面截圖:(相冊選取時,選擇的是小弟半裸球場照
)
附上Demo下載下傳位址:點選下載下傳
作為辛苦勞動成果,設定了3分的下載下傳小費,沒分的同學可以想辦法擷取積分,好的社群需要大家一同建設,杜絕伸手黨!
加入我們的QQ群或微信公衆賬号請檢視: Ryan's zone公衆賬号及QQ群
覺得文章對你有用,點選右下角的轉發按鈕分享給更多人!
同時歡迎關注我的新浪微網誌和我交流:@唐韌_Ryan