標籤:crop 剪裁 image 圖片剪裁 android
上篇文章主要介紹了我開源在Github上的圖片剪裁庫(ImageCropper)的基本特性和用法,從本文開始,慢慢介紹一些開發圖片剪裁應用中涉及的知識點和技術。
其實Android系統本身也提供了圖片剪裁的模組,我們可以直接通過Intent來調用系統的圖片剪裁功能,本文我們就先瞭解一下系統內建的圖片剪裁功能是如何調用的吧。
得到被剪裁圖片的URL地址
既然是圖片剪裁,就一定要有被剪裁的圖片,由於圖片資料一般很大,為了防止記憶體溢出,普通APP與Android系統圖片剪裁應用之間是通過URL來傳遞圖片地址的。這個URL與我們常說見的網路URL不一樣,它並不是HTTP開頭,而是以file或者content開頭的字串,例如:
“file:///sdcard/test.jpg”“content://media/external/images/media/21936”
這裡,我們首先介紹擷取圖片URL的方法:
(1) 從SDCard中得到圖片的URL
假設知道圖片存放的路徑位於“/sdcard/test.jpg”,那麼,可以通過下面這種方式來得到URL:
Uri imageUri = Uri.fromFile(new File("/sdcard/test.jpg"));
當然,如果圖片是從網路擷取的,並不存在於sdcard中,則可以先儲存一份臨時檔案到sdcard中,再通過上述方法得到URL。
註:通過這種方式得到的URL,一般以“file://”開頭。
(2) 從多媒體資料庫中得到圖片的URL
Android系統會在後台定期掃描儲存在系統中的多媒體檔案,如:音樂、圖片和視頻等,相關的資訊會存放在系統的多媒體資料庫中,位於/data/data/com.android.providers.media/databases中,我們可以通過檢索該資料庫得到圖片的URL(例如:通過檢索資料庫得到系統最後一次添加/修改的照片URL),也可以通過Intent.ACTION_PICK來調用系統的圖片選取器來選擇一張圖片,圖片選取器會將圖片的URL地址放入Intent的data中返回。
後者的應用更多一些,我們主要介紹一下後者,即通過Intent.ACTION_PICK來得到圖片URL地址,方法如下:
public void pickImage() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent,REQUEST_CODE_PICK_IMAGE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; } if( requestCode == REQUEST_CODE_PICK_IMAGE ) { Uri imageUri = data.getData(); //...... }}
註:通過這種方式得到的URL,一般以“content://media”開頭。
(3) 調用系統的相機拍一張照片
當然,被剪裁的圖片也可以是通過Camera拍攝的一張照片,方法如下:
Uri pictureURL = Uri.fromFile(new File("/sdcard/temp.jpg"));public void takenPicture() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT,pictureURL ); startActivityForResult(intent,REQUEST_CODE_TAKEN_PICTURE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; } if( requestCode == REQUEST_CODE_TAKEN_PICTURE ) { Uri imageUri = pictureURL; //...... }}
通過代碼你可能已經注意到了,其實這種方式得到的圖片URL,與第一種方式是一樣的,通過圖片的儲存路徑轉化過來的,只不過傳遞給了系統Camera應用中。
2. 通過Intent調用系統的圖片剪裁功能
有了圖片的URL,調用系統的圖片剪裁就很簡單了,只需要構建一個Intent對象,並設定相關參數即可,用法樣本如下:
public void test( Uri imageUri ) { Uri croppedUri = Uri.fromFile(new File("/sdcard/cropped.jpg")); startSystemCropImage(imageUri,croppedUri);}public void startSystemCropImage( Uri src, Uri dst ) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.putExtra("crop", "true"); // 設定剪裁圖片的源/目的地址URL intent.setDataAndType(src,"image/*"); intent.putExtra(MediaStore.EXTRA_OUTPUT,dst); // 設定剪裁圖片的寬高比 //intent.putExtra("aspectX", 2); //intent.putExtra("aspectY", 1); // 固定剪裁圖片的寬高值 //intent.putExtra("outputX", 680); //intent.putExtra("outputY", 480); // 為了防止記憶體限制以及各個廠商返回的資料不統一,建議不要直接使用這個返回的資料,而是資料返回的URL intent.putExtra("return-data", false); startActivityForResult(intent, REQUEST_CODE_SYSTEM_CROPPER);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; } if( requestCode == REQUEST_CODE_IMAGE_CROPPER ) { Uri croppedUri = data.getExtras().getParcelable(MediaStore.EXTRA_OUTPUT); InputStream in = null; try { in = getContentResolver().openInputStream(croppedUri); Bitmap b = BitmapFactory.decodeStream(in); mImageView.setImageBitmap(b); } catch (FileNotFoundException e) { e.printStackTrace(); } } super.onActivityResult(requestCode, resultCode, data);}
3. 小結
注意添加讀寫SDCard的許可權:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
關於調用系統的圖片剪裁應用就介紹到這兒了,有任何疑問歡迎留言或者來信[email protected]交流。
本文出自 “對影成三人” 部落格,請務必保留此出處http://ticktick.blog.51cto.com/823160/1602611
Android開發實踐:自己動手編寫圖片剪裁應用(2)