Android開發實踐:自己動手編寫圖片剪裁應用(2)

來源:互聯網
上載者:User

標籤:crop   剪裁   image   圖片剪裁   android   

上篇文章主要介紹了我開源在Github上的圖片剪裁庫(ImageCropper)的基本特性和用法,從本文開始,慢慢介紹一些開發圖片剪裁應用中涉及的知識點和技術。


其實Android系統本身也提供了圖片剪裁的模組,我們可以直接通過Intent來調用系統的圖片剪裁功能,本文我們就先瞭解一下系統內建的圖片剪裁功能是如何調用的吧。


  1. 得到被剪裁圖片的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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.