uCrop介紹,我們自己的安卓版圖片裁剪庫
來自: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0123/3909.html
在Yalantis,我們開發了許多不同的安卓app,根據我們的經驗來看,幾乎每個我們開發的應用都需要圖片裁剪的功能。圖片裁剪可以用于很多目的,從普通到頭像調整到按比例裁剪以及圖片變換等更復雜的功能。
考慮到想為我們的所有客戶都提供最好的圖片編輯工具,我們決定創建 uCrop , 一個安卓版的圖片裁剪庫。
你可能會想為什么我們不直接使用現有的圖片裁剪方案。畢竟,你可以在 Github和 Android Arsenal 上找到許多這樣的項目。但是有一點:沒有一個滿足我們的需求。讓我們快速瀏覽一遍最流行的開源圖片裁剪庫,然后解釋為什么他們都不是很符合要求。
為什么其它的開源庫都不好
1. SoundCloud cropping library
我已經在幾個項目上成功的使用了SoundCloud的庫,但是仍然它有幾個問題讓我感到很悲劇。
首先,你是通過一個裁剪框操作的,而不是圖片本身。如果你需要裁剪圖片里面很小的一片區域,這是很蛋疼的,而且從用戶體驗的角度來講著也是不對的。我相信Instagram 已經在給了我們一些UX方面的教訓,這種可移動的裁剪框已經死去了。
再者,SoundCloud 的裁剪庫并不允許我們做任何的旋轉。拜托,老大!大家都知道有很多“神奇”的安卓手機里面圖片的EXIF 信息是錯誤的(謝天謝地,我們已經通過 CWAC 解決了這個爛攤子)。再說,許多用戶也想能夠旋轉圖片(不僅僅是想旋轉90度)。
最后,使用SoundCloud庫不能改變寬高比。當然,如果你只是想得到一個正方形的頭像,這完全沒有問題。但是使用這個庫無法實現更多形狀的有趣的頭像照片。
2. Edmodo Cropper
Edmodo Cropper和SoundCloud 庫非常相似,和SoundCloud 也有一下共同的缺陷。但是,這個庫允許動態的改變裁剪框的寬高比例。它也有guideline而且有旋轉圖片的method (但是僅僅是一個method,因此你需要自己弄一個gesture detection 或者一個spinner 來控制手勢 )。
3. Scissors
Scissors 是一個比較新的庫,最近在一個 Android Weekly issue 上看到之后也非常興奮。但是5分鐘之后就興奮感就消失了。這是從關于Scissors的 博客 中引用的一段話:
...我們研究了現有的解決方案。沒有一個 滿足了我們的需求,因此我們覺得建立自己的。
這種方式值得表揚。但實際上,不過是又多了一個不能動態旋轉圖片和改變寬高比例的library 罷了。不過,Scissors倒是集成了一些流行的圖片庫,比如 Picasso , Glide , 和 Universal Image Loader 。我希望Scissors 在后續的版本能有更多實用的功能。
[ I do like how Scissors implements zoom. The image always scales down to the center of the image, no matter where your fingers are.]
在分析了現有庫的缺陷之后,我們決定創建 我們自己的 library ,支持手勢和精煉的用戶體驗。
uCrop: 一個解決了圖片裁剪問題的Library
uCrop 是一個讓你可以裁剪圖片以進一步使用的安卓庫。主要功能包括:
-
縮放圖片
-
旋轉圖片
-
改變裁剪的寬高比
-
支持觸摸手勢:單手指滾動和平移圖片,雙手指旋轉圖片,捏圖變焦(放大縮小),雙擊變焦。
-
功能多樣化的簡便Activity,有精確化縮放和旋轉的空間以及一套預定義的寬高比例(1:1, 4:3, 3:4, 2:3, 3:2, 16:9, 9:16 +原始圖片的比例)。
uCrop 有一個用于初始化和配置的builder類型的接口。library 本身只需要最小api level 10,但是sample 是在 API level 15+上運行的。
如何在項目中使用uCrop?
在項目中引入庫:
compile 'com.yalantis:ucrop:1.0.1'
在AndroidManifest.xml中添加UCropActivity:
<activity android:name="com.yalantis.ucrop.UCropActivity" android:screenOrientation="portrait"/>
uCrop的配置是使用的builder模式:
UCrop.of(sourceUri, destinationUri) .withAspectRatio(16, 9) .withMaxResultSize(maxWidth, maxHeight) .start(context);
重寫onActivityResult方法并處理裁剪的結果:
@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?
你可以改變如下設置:
-
compression format 壓縮格式(e.g. PNG, JPEG, WEBP).
-
compression quality壓縮質量 [0 - 100] (無損的PNG會忽略質量設置 )
-
support for simultaneous gestures
-
從原始圖片解碼的Bitmap的最大值(如果你想重寫默認的行為)。
-
以及更多 (比如color palette)
下篇文章我們將分享建立 uCrop 的經驗,敬請關注!
</div>