譯者按:在外企工作的半年多中花了不少時間在國外的網站上搜尋資料,其中有一些相當有含金量的文章,我會陸陸續續翻譯成中文,與大家共享之。初次翻譯,“信達雅”三境界恐怕只到信的層次,望大家見諒!
這篇文章相當經典而實用,想當初我做手機拍照截圖的時候,大多都是在網上抄來抄去的內容,從來沒有人考慮過實際項目中的需求。實際上,拍照傳大圖片,如果用普通方式會耗用極大的內存,Android一個App原則上的16M內存限制可以一下子被耗光。Android在拍照上有一個隱藏的設計,如果拍照圖片過大,只返回一張縮略圖。具體到不同手機,都是不一樣的。
-------------------------------------------------------------------------------------
譯文:
概述
我寫這篇文章是為了發表我對MediaStore裁剪圖片功能的一些簡要研究。基本上,如果你要寫一個應用程序,使用已有的Media Gallery並允許用戶在你的應用裡選取TA的圖片的一部分(可選功能:人臉識別)。 可以使用一個Intent做到這個,但是也存在著相應的問題,總的來說也缺少這方面的文檔告訴我們怎麼實現它。 另外,這篇文章基於2.1並且在Nexus One上做了測試。 Nexus One上的實現似乎被這群人寫在了這裡: Media Gellery for Nexus One 。
反饋
這篇文章需要使用基於我的研究所寫的程序。如果你對我推薦的實現方案有所改進,請讓我知道。我會相應的更新這篇文章。
Intent細節
首先,讓我們探討下Intent以及它的特點。在看了一些代碼示例以後,我發現我可以很輕松的使用如下的Intent調用裁剪功能:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType(“image/*”);
intent.putExtra(“crop”, “true”);
…
然而,這是在我缺少附加的文檔,不知道這些選項的具體含義等等情況之下的選擇。所以,我將我的yanj整理成一個表格 ,並寫了一個演示程序,力圖演示控制此功能的所有可供選項。
你可以在你的程序中使用使用我的代碼,並且擴展它。我會將之附加在這篇文章上。
Exta Options Table for image/* crop:
附加選項 數據類型 描述 crop String 發送裁剪信號 aspectX int X方向上的比例 aspectY int Y方向上的比例 outputX int 裁剪區的寬 outputY int 裁剪區的高 scale boolean 是否保留比例 return-data boolean 是否將數據保留在Bitmap中返回 data Parcelable 相應的Bitmap數據 circleCrop String 圓形裁剪區域? MediaStore.EXTRA_OUTPUT ("output") URI 將URI指向相應的file:///...,詳見代碼示例現在,最令人困惑的是MediaStore.EXTRA_OUTPUT以及return-data選項。
你主要有兩種方式從這個Intent中取得返回的bitmap:獲取內部數據或者提供一個Uri以便程序可以將數據寫入。