Android之uCrop (裁剪) 的基本使用資料

Android 拍照、選擇圖片并裁剪?

uCrop裁剪

uCrop裁剪2

uCrop裁剪3

1.權限檢查

private static final int REQUEST_CAMERA_PERMISSION = 333;
private void requestCameraPermission() {if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.CAMERA},REQUEST_CAMERA_PERMISSION);}if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},REQUEST_CAMERA_PERMISSION);}if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_CAMERA_PERMISSION);}}

?2.拍照 相冊選擇彈框

private void showMenuDialog() {List<String> data = new ArrayList<>();data.add("拍照");data.add("相冊中獲取");// 底部選擇框new MenuDialog.Builder(this)// 設置 null 表示不顯示取消按鈕//.setCancel(getString(R.string.common_cancel))// 設置點擊按鈕后不關閉對話框//.setAutoDismiss(false).setList(data).setListener(new MenuDialog.OnListener<String>() {@Overridepublic void onSelected(BaseDialog dialog, int position, String string) {phoneArr = new JSONArray();phoneArray = new JSONArray();switch (position) {case 0:
//                              // 調本地相機camera();break;case 1:openSysAlbum();break;case 2:break;default:break;}}@Overridepublic void onCancel(BaseDialog dialog) {toast("取消了");}}).show();}
/*** 拍照*/private void camera() {File file = new File(SAVE_REAL_PATH, System.currentTimeMillis() + ".jpg");Log.e(TAG, "拍照路徑:" + file.getPath());if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//Android7.0以上URIif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//通過FileProvider創建一個content類型的Uri  注意報名和大小寫
//            mProviderUri = FileProvider.getUriForFile(getActivity(), "com.baijie.crm.fileProvider", file);mProviderUri = FileProvider.getUriForFile(this, AppConfig.getPackageName() + ".provider", file);intent.putExtra(MediaStore.EXTRA_OUTPUT, mProviderUri);//添加這一句表示對目標應用臨時授權該Uri所代表的文件intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);} else {mUri = Uri.fromFile(file);intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);}try {startActivityForResult(intent, RESULT_CODE_1);} catch (ActivityNotFoundException anf) {Log.e(TAG, "攝像頭未準備好!");}}/*** 打開系統相冊*/private void openSysAlbum() {Intent innerIntent = new Intent();if (Build.VERSION.SDK_INT < 19) {innerIntent.setAction(Intent.ACTION_GET_CONTENT);} else {innerIntent.setAction(Intent.ACTION_OPEN_DOCUMENT);}innerIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");Intent wrapperIntent = Intent.createChooser(innerIntent, "");startActivityForResult(wrapperIntent, SELECT_IMAGE_REQUEST_CODE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == UCrop.RESULT_ERROR) {LogUtil.d("--onActivityResult--:", UCrop.getError(data) + "");return;}if (resultCode == RESULT_OK) {switch (requestCode) {case RESULT_CODE_1:// 拍照if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {cropRawPhoto(mProviderUri);} else {cropRawPhoto(mUri);}break;case RESULT_CODE_2:Log.i(TAG, "onActivityResult: " + data.getData());cropRawPhoto(data.getData());break;case UCrop.REQUEST_CROP:// 裁剪后的圖片進行識別LogUtil.d(TAG, "onActivityResult: " + UCrop.getOutput(data));LogUtil.d(TAG, UCrop.getOutput(data) + "");// 在這里使用imageBitmap進行文字識別Uri uri = UCrop.getOutput(data);if (uri != null) {try {// 使用MediaStore來獲取Bitmap對象Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);// 使用bitmap對象...recognizeTextFromBitmap(bitmap);} catch (IOException e) {e.printStackTrace();}}break;case SELECT_IMAGE_REQUEST_CODE:// 相冊中選擇圖片去識別Uri uri_ = data.getData();Bitmap bitmap = getBitmapFromUri(uri_, this);recognizeTextFromBitmap(bitmap);break;default:break;}}}

3.調用UCrop進行圖片裁剪

/*** 使用UCrop進行圖片剪裁** @param uri*/public void cropRawPhoto(Uri uri) {UCrop.Options options = new UCrop.Options();// 修改標題欄顏色options.setToolbarColor(getResources().getColor(R.color.teal_200));// 修改狀態欄顏色options.setStatusBarColor(getResources().getColor(R.color.teal_700));// 隱藏底部工具options.setHideBottomControls(true);// 圖片格式options.setCompressionFormat(Bitmap.CompressFormat.JPEG);// 設置圖片壓縮質量options.setCompressionQuality(100);// 是否讓用戶調整范圍(默認false),如果開啟,可能會造成剪切的圖片的長寬比不是設定的// 如果不開啟,用戶不能拖動選框,只能縮放圖片options.setFreeStyleCropEnabled(true);options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.NONE, UCropActivity.NONE); // 只允許縮放// 設置圖片壓縮質量options.setCompressionQuality(100);// 圓options.setCircleDimmedLayer(false);// 不顯示網格線options.setShowCropGrid(true);createOrExistsDir(SAVE_REAL_PATH);// 設置源uri及目標uriUCrop.of(uri, Uri.fromFile(new File(SAVE_REAL_PATH, System.currentTimeMillis() + ".jpg")))// 長寬比
//                .withAspectRatio(1, 1)// 圖片大小
//                .withMaxResultSize(200, 200)// 配置參數.withOptions(options).start(this);}public boolean createOrExistsDir(String dirPath) {File dir = new File(dirPath);// 判斷目錄是否存在if (!dir.exists()) {// 嘗試創建目錄return dir.mkdirs();}return true; // 目錄已存在,返回true}

4.裁剪后的圖片進行文字內容的識別,這里是識別手機號碼這種數字類型的內容

private void recognizeTextFromBitmap(Bitmap bitmap) {InputImage image = InputImage.fromBitmap(bitmap, 0);TextRecognizer myRecognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS);myRecognizer.process(image).addOnSuccessListener(new OnSuccessListener<Text>() {@Overridepublic void onSuccess(com.google.mlkit.vision.text.Text text) {String identifyContent = text.getText();LogUtil.d(TAG, "識別結果為:" + identifyContent);
//                        phoneArr.put(identifyContent);etPhone.setText(identifyContent);myRecognizer.close();startActivity(new Intent(ctx, ConfirmCustomerActivity.class).putExtra("IdentifyContent", identifyContent));}}).addOnFailureListener(new OnFailureListener() {@Overridepublic void onFailure(@NonNull Exception e) {// 處理錯誤e.printStackTrace();// 釋放資源myRecognizer.close();}});}public Bitmap getBitmapFromUri(Uri uri, Context context) {ContentResolver contentResolver = context.getContentResolver();InputStream inputStream = null;try {inputStream = contentResolver.openInputStream(uri);Bitmap bitmap = BitmapFactory.decodeStream(inputStream);return bitmap;} catch (FileNotFoundException e) {e.printStackTrace();} catch (OutOfMemoryError e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return null;}
private String SAVE_REAL_PATH = "/sdcard/DCIM/Camera";Uri mProviderUri;Uri mUri;private final int RESULT_CODE_1 = 1;private final int RESULT_CODE_2 = 2;private final int SELECT_IMAGE_REQUEST_CODE = 999;
// 流式布局implementation 'com.github.AnJiaoDe:MultiFlowLayout:1.1.1'implementation 'com.google.mlkit:text-recognition:16.0.0'implementation 'com.github.yalantis:ucrop:2.2.6'implementation 'com.github.yalantis:ucrop:2.2.6-native'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75807.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75807.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75807.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32基礎教程——輸入捕獲模式測量PWM頻率

目錄 前言 技術實現 原理圖 連線圖 代碼實現 內容要點 PWM基本結構 開啟外設時鐘 配置GPIO端口 配置時基單元 初始化輸出比較單元 輸出比較通道重映射 輸入捕獲功能初始化 計算捕獲PWM的頻率 實驗結果 問題記錄 前言 IC&#xff08;Input Capture&#xff09;輸…

基于網啟PXE服務器的批量定制系統平臺(詳細版)

項目說明 該項目共分為2個子項目&#xff0c;由iventoy和定制安裝兩部分組成 該項目旨在復習鞏固系統服務部署使用、shell編程等知識&#xff0c;旨在讓學生增加知識面&#xff0c;提高項目實習經歷&#xff0c;充實簡歷 項目背景&#xff1a; 公司新購了一批服務器和臺式機…

旅游CMS選型:WordPress、Joomla與Drupal對比

內容概要 在旅游行業數字化轉型進程中&#xff0c;內容管理系統&#xff08;CMS&#xff09;的選擇直接影響網站運營效率與用戶體驗。WordPress、Joomla和Drupal作為全球主流的開源CMS平臺&#xff0c;其功能特性與行業適配性存在顯著差異。本文將從旅游企業核心需求出發&…

el-table下的復選框關聯勾選

效果展示&#xff1a; <el-table style"height: 500px;" :data"tableData" border empty-text"暫無數據" v-loading"loading":header-cell-style"{ text-align: center }" :cell-style"{ text-align: center }"…

解決Cubemx生產的 .ioc文件不能外部打開的方法

正常來說&#xff0c;cubemx生成的文件會有圖標 但是當圖標白色的時候&#xff0c;無法通過直接點擊這個文件進入cubemx 1.首先檢查java環境是不是裝的JAVA8&#xff0c;如果是的話進行第二步操作&#xff1b; 2.重新安裝一次cubemx&#xff0c;在安裝的時候選擇為我安裝&…

從零構建大語言模型全棧開發指南:第三部分:訓練與優化技術-3.1.3分布式數據加載與并行處理(PyTorch DataLoader優化)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 3.1.3 分布式數據加載與并行處理(`PyTorch DataLoader`優化)1. 大規模數據加載的挑戰與瓶頸分析1.1 數據加載流程的時間分解2. PyTorch DataLoader的深度優化策略2.1 核心參數調優2.2 分布式數據分片策…

K8S學習之基礎五十七:部署代碼掃描工具sonarqube

部署代碼掃描工具sonarqube 拉取postgres、sonarqube鏡像&#xff0c;在harbor上創建postgres、sonarqube項目&#xff0c;將鏡像上傳至harbordocker pull postgres docker pull sonarqube docker tat postgres:latest 172.16.80.140/postgres/postgres:latest docker tat sona…

RAG技術的進化:RQ-RAG查詢優化/化繁為簡Adaptive-RAG智能分類/精準出擊

嘿,親愛的算法探險家們!歡迎來到RAG技術的“奇幻冒險”之旅!?? 今天,咱們要一起探索的是如何讓大語言模型(LLM)從“呆萌小學生”進化成“機智博士生”的奇妙旅程! 想象一下,你正在和一個超級聰明的AI聊天,但它有時候會像個小迷糊,回答得讓你哭笑不得。這時候,RAG…

11:00開始面試,11:08就出來了,問的問題有點變態。。。

從小廠出來&#xff0c;沒想到在另一家公司又寄了。 到這家公司開始上班&#xff0c;加班是每天必不可少的&#xff0c;看在錢給的比較多的份上&#xff0c;就不太計較了。沒想到8月一紙通知&#xff0c;所有人不準加班&#xff0c;加班費不僅沒有了&#xff0c;薪資還要降40%…

滲透測試中發現ak/sk泄露時的驗證工具

項目地址&#xff1a;https://github.com/libaibaia/cloudsec啟動命令&#xff1a;java -jar cloudSec-1.2.2-SNAPSHOT.jar 訪問&#xff1a;http://localhost:8000/#/admin/login 默認用戶名密碼&#xff1a;admin/admin123 注&#xff1a;8000 端口運行&#xff0c;如占用先…

【藍橋杯】重點沖刺

【最高優先級】必考核心算法(占分60%以上) 動態規劃(DP) ?????? 背包問題:01背包、完全背包(必須掌握空間優化的一維寫法) 線性DP:最長上升子序列(LIS)、最長公共子序列(LCS) 路徑問題:網格路徑計數(含障礙物)、最小路徑和 經典模型:打家劫舍、股票買賣問…

藍橋杯python編程每日刷題 day 20

題目&#xff1a; 給定一個長度為 N 的整數序列&#xff1a;A1, A2, , AN。現在你有一次機會&#xff0c;將其中連續的 K 個數修改成任意一個相同值。請你計算如何修改可以使修改后的數列的最長不下降子序列最長&#xff0c;請輸出這個最長的長度。 最長不下降子序列是指…

游戲引擎學習第185天

回顧并計劃今天的內容 我們完成了開始整理這些數據的工作&#xff0c;但我們還沒有機會真正去查看這些數據的具體內容&#xff0c;因為我們只是剛剛開始了數據整理的基本工作。我們收集了大量的信息&#xff0c;但到目前為止&#xff0c;仍然沒有足夠的可視化工具來幫助我們理…

協議學習——1 NCDSSB

上次面試NCDssb, 今天特意學習下&#xff0c;除了物理層的定義&#xff0c;其實再很多物理層的書上都有&#xff0c;主要是講下RRC曾怎么玩的。 配置在專用BWP上配置&#xff0c;切實BWP的專用部分

pom.xml與.yml,java配置參數傳遞

pom.xml與 .yml java配置參數傳遞 在Java項目中&#xff0c;通過 pom.xml 和 .yml 文件&#xff08;如 application.yml&#xff09;傳遞變量通常涉及 構建時&#xff08;Maven&#xff09;和 運行時&#xff08;Spring Boot&#xff09;兩個階段的配置。以下是具體的實現方法&…

【解決】:VSCode 中識別不到電腦中的已安裝的 Git

# 問題 自己電腦中明明已經安裝了 git &#xff0c;但在 vscode 中確識別不到。——————————&#xff08;問題一樣就看下去&#xff0c;不一樣早早潤。省流&#xff01;&#xff01;&#xff01;&#xff01;&#x1f680;&#xff09; # 【第一步】首先要確認你電腦中…

gogs私服搭建

一.介紹&#xff1a; gogs是一個用Go語言開發的自助Git服務&#xff0c;目標是簡單、快速搭建Git服務&#xff0c; 支持多種平臺&#xff0c;包括Linux、Windows等。它類似于GitHub&#xff0c;但更輕量&#xff0c;適合個人或小團隊使用&#xff0c; 在簡化git服務搭建流程的…

數位和相等

問題描述 如果一個正整數轉化成二進制與轉換成八進制后所有數位的數字之和相等&#xff0c;則稱為數位和相等的數。 前幾個數位和相等的正整數為 11, 88, 99, 6464&#xff0c;…… 請問第 2323 個數位和相等的正整數是多少&#xff1f; import java.util.Scanner; public …

Java-servlet(九)前端會話,會話管理與Cookie和HttpSession全解析

Java-servlet&#xff08;九&#xff09;前端會話&#xff0c;會話管理與Cookie和HttpSession全解析 前言一、什么是會話二、會話管理1. 隱藏的表單域2. 網址重寫3. 使用 Cookie3.1 Cookie 的工作流程3.2 Java 中的方法&#xff0c;Cookie 類 三、Cookie 的實現1. 創建 Cookie2…

uniapp開發中store的基本用法和模塊化詳解

在 UniApp 開發中,狀態管理是非常重要的一部分,尤其是在復雜的應用場景下。Vuex 是 Vue.js 的官方狀態管理庫,可以幫助開發者集中管理應用的狀態數據。UniApp 作為基于 Vue.js 的跨平臺開發框架,也支持使用 Vuex 進行狀態管理。 以下是關于 Vuex 在 UniApp 中的詳細用法介…