原文鏈接:https://yalantis.com/blog/introducing-ucrop-our-own-image-cropping-library-for-android
譯者:Eirture
我們在 Yalantis 開發了許多不同的 Android 應用,經驗告訴我們,幾乎在所有的應用中,都需要圖片裁剪的功能。圖片裁剪的用途很廣,從簡單的用戶頭像調整到圖片的比例裁剪、靈活變換等各種復雜的處理。
我們想為所有的用戶提供最好的圖片處理工具,所以決定創建Android的圖片裁剪庫 uCrop 。 可以在 Product Hunt 上為 uCorp 投票。
也許你會好奇,為什么我們不使用現成的 Android 圖片裁剪解決方案。 畢竟,可以在 Github 或者 Android Arsenal 上找到很多這類的庫。但是問題是,那些解決方案都不滿足我們的需求。我們來看一些主流的開源圖片裁剪庫,為什么不符合我們的需求。
為什么其它的開源庫不好用
我在幾個項目里面使用了 SoundCloud 庫很成功,但是仍然有幾個問題讓我很頭痛。
首先,你操作的是一個裁剪的框,而不是圖片本身。當需要裁剪一個很小面積的圖片時,這會你感覺有點痛苦。這是與用戶使用習慣向悖的。我確信 Instagram 傳授給我們的是一些優秀的 UX (用戶體驗),可以移動的裁剪框也已經滅絕了。
其次,SoundCloud 裁剪庫不允許用戶旋轉圖片。Come on, guys! 所有人都知道,有成百上千“不可思議”的安卓手機給照片設置了錯誤的EXIF信息(謝天謝地,我們有 CWAC 來清理這個爛攤子)。而且,很大部分的用戶是希望能夠轉動圖片的(不僅僅是 90 度)。
最后同樣重要的一點,使用 SoundCloud 庫不能改變長寬比。當然,如果你使用它僅僅是需要獲取一個方形的頭像,那沒有任何問題。但是,其它很多很有趣的頭像形狀,用這個庫無法實現。
Edmodo Cropper 與 SoundCloud 庫非常相似,缺點也同樣相似。不過,這個庫支持動態的改變裁剪框的長寬比。它也有參考線和一種旋轉圖片的方式(僅僅只有一種方式,所以你需要想辦法解決手勢檢測或是一些控件來控制自己的手勢)。

Scissors 是一個新的庫,不久前我在一個安卓問題周刊上看到它的時候特別激動。但 5 分鐘內我的興奮就消失了。引用一句關于 Scissors 的博文:
...我們研究了現有的庫。都不符合我們的需求,因此我們決定構建自己庫。
這確實是一個值得稱贊的方法。實際上,我們找到又是一個不能旋轉圖片,也不能動態調整寬高比的庫。盡管 Scissors 集成了一些主流的圖片加載庫,像 Picasso, Glide 以及 Universal Image Loader。希望 Scissors 在后續的版本中有更多實用的功能。

分析完這些現有庫的缺點,我們決定創建自己的庫,支持手勢并且有一個良好的 UX。
uCrop: 一個解決圖片裁剪問題的庫
安卓庫 uCrop 允許你修剪圖片來更好的使用。uCrop 重要的特性如下:
- 縮放圖片
- 旋轉圖片
- 改變裁剪長寬比例
- 支持出手勢:一根指頭滑動圖片,兩根指頭旋轉圖片,捏拉縮放,雙擊縮放。
- 上手即可用的 Activity 功能設計,精巧的控件實現更精確的圖片旋轉和縮放,以及一組通用的預設長寬比(1:1,4:3,3:4,2:3,3:2,16:9,9:16 + 圖片原始比例)。

uCrop 有一個初始化的構建類型接口,來為你的應用配置一些適當的屬性。uCrop 庫最低的版本要求是 API 10,示例應用工作的版本是 API 15+ 。
如何在你的項目中使用 uCrop ?
- 添加 uCrop 庫依賴作為本地項目庫。
```
compile 'com.yalantis:ucrop:[latest version]'
```
- 使用構造者模式來創建 uCrop 及配置。
```
UCrop.of(sourceUri, destinationUri)
.withAspectRatio(16, 9)
.withMaxResultSize(maxWidth, maxHeight)
.start(context);
```
- 覆寫 onActivityResult 方法來捕獲 uCrop 返回數據。
```
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
final Uri resultUri = UCrop.getOutput(data);
} else if (resultCode == UCrop.RESULT_ERROR) {
final Throwable cropError = UCrop.getError(data);
}
}
```
如何自定義 uCrop
你可以改變下面這個設置:
- 壓縮格式 (e.g. PNG, JPEG, WEBP)。
- 壓縮的質量[0 - 100] (PNG 是無損的,會忽略質量設置)
- 支持并發的手勢
- Bitmap 最大的尺寸是從 Uri 中解碼來的,并且同樣會在裁剪的視圖中。(如果你想覆蓋默認的屬性)
- 更多(e.g. color palette)
在下一篇文章中,將會展示我們構建 uCrop 的經歷,敬請關注!