天天看點

Android拍照、相冊選取、裁剪圖檔綜合Demo

在《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上,歡迎大家持續支援、改進。

界面截圖:(相冊選取時,選擇的是小弟半裸球場照

Android拍照、相冊選取、裁剪圖檔綜合Demo

Android拍照、相冊選取、裁剪圖檔綜合Demo
Android拍照、相冊選取、裁剪圖檔綜合Demo
Android拍照、相冊選取、裁剪圖檔綜合Demo

附上Demo下載下傳位址:點選下載下傳

作為辛苦勞動成果,設定了3分的下載下傳小費,沒分的同學可以想辦法擷取積分,好的社群需要大家一同建設,杜絕伸手黨!

加入我們的QQ群或微信公衆賬号請檢視: Ryan's zone公衆賬号及QQ群

覺得文章對你有用,點選右下角的轉發按鈕分享給更多人!

同時歡迎關注我的新浪微網誌和我交流:@唐韌_Ryan