使用安卓自帶裁剪功能

介紹

安卓自帶了裁剪功能,使用起來也簡單,主要屬性如下:

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setDataAndType(photoUri,"image/*");
        intent.putExtra("crop","true");//發(fā)送裁剪信號,去掉也能進行裁剪 
        intent.putExtra("scale",true);// 去黑邊,是否保存比例
        intent.putExtra("scaleUpIfNeeded",true);// 去黑邊
        intent.putExtra("aspectX",2);
        intent.putExtra("aspectY",1);
        intent.putExtra("outputX",800);
        intent.putExtra("outputY",400);
        intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra(MediaStore.EXTRA_OUTPUT,saveUri);
        intent.putExtra("circleCrop",false);//字面意思是圓形的裁剪框。但是目測也需要手機的支持。
        intent.putExtra("return-data",false);
        intent.putExtra("noFaceDetection",false);//取消人臉識別

說明一

在使用過程中需要申請讀寫的權(quán)限

說明二

     intent.putExtra("aspectX",2);
     intent.putExtra("aspectY",1);

上述兩個屬性控制裁剪框的縮放比例。
當用戶用手拉伸裁剪框時候,裁剪框會按照上述比例縮放。

    intent.putExtra("outputX",800);
    intent.putExtra("outputY",400);

上述兩個屬性控制裁剪完畢,保存的圖片的大小格式。
哪怕上述裁剪框你按照1:1的比例來裁剪的,那么最后成像也是800*400,按照2:1的樣式保存,
所以說,裁剪框就是個參考。
如果不想要這些規(guī)規(guī)矩矩,那么就不用添加這些屬性。那么裁剪框以及報錯的成像都按照用戶手動操作的
來保存成圖片的。

說明三

    intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
    intent.putExtra(MediaStore.EXTRA_OUTPUT,saveUri);

這兩個屬性第一個是控制裁剪完的圖片保存的格式
第二個是裁剪完的圖片保存的路徑
錯誤:在7.0以上系統(tǒng)裁剪完畢之后,會提示“無法保存經(jīng)過裁剪的圖片”
這是因為,我們在7.0以上跨文件傳輸uri時候,需要用FileProvider,但是這里需要用
Uri.fromFile(file)生成的,而不是使用FileProvider.getUriForFile

說明四

intent.setDataAndType(photoUri,"image/*");
關(guān)鍵屬性

表明你要裁剪的的圖片的uri ,關(guān)鍵是7.0以后的uri獲?。?/p>

private Uri getUri(String path){
        File file = new File(path);
        Uri uri = null;
        if (Build.VERSION.SDK_INT >= 24) {
            try {
                uri = FileProvider.getUriForFile(ShenPiXiangXiActivity.this
                        , PictureManager.getFileProviderName(ShenPiXiangXiActivity.this)
                        , file);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
                ToastUtils.showShort("獲取文件路徑失敗");
            }
        } else {
            uri = Uri.fromFile(file);
        }

        return uri;
    }

說明五

        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

添加此屬性是為了解決:調(diào)用裁剪框時候提示:圖片無法加載或者加載圖片失敗或者無法加載此圖片

說明六

    intent.putExtra("spotlightX", 1.1f);//X軸方向的抽屜式壁紙選擇框
    intent.putExtra("spotlightY", 2.1f);//Y軸方向的抽屜式壁紙選擇框
    intent.putExtra("showWhenLocked",true); //默認false,不知道啥意思

不明覺厲,不知啥意思

說明七

        intent.putExtra("set-as-wallpaper",true);

默認是false,當你弄成true的時候,你就會發(fā)現(xiàn)打開不是裁剪的,而是設(shè)置為壁紙的操作。

說明八

介紹一組可選屬性,通過上面描述,可以知道,用戶將需要裁剪的圖片uri和保存的uri傳遞過去,就好了,當裁減完畢返回來時候,resultCode = RESUK_OK,那么就可以進行相應的操作了!
但是如果想要返回來bitmap,則需要進行下面的兩個屬性操作:

        intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("return-data",true);

那么就會有Bitmap返回:

 if (data != null && data.getParcelableExtra("data") != null) {
                mStream = new ByteArrayOutputStream();
                mBitmap = data.getParcelableExtra("data");
                mBitmap.compress(Bitmap.CompressFormat.PNG, 100, mStream);
                /**圖片可以應用了*/
                /**接下來就是上傳到服務器*/
                File files = creatFile(mBitmap);//變成文件
                ...后續(xù)根據(jù)需要來...
}

注意
需要bitmap的好像是圖片不能太大,要不然內(nèi)存占有過大!

參考
http://www.itdecent.cn/p/c6271f5dad46
https://segmentfault.com/q/1010000005070720/a-1020000005071373

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容