当前位置: 首页 > news >正文

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>() {

                    @Override
                    public 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;
                        }
                    }

                    @Override
                    public 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以上URI
        if (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);
    }

    @Override
    protected 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及目标uri
        UCrop.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>() {
                    @Override
                    public 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() {
                    @Override
                    public 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'

相关文章:

  • 滑动窗口(1)—⻓度最⼩的⼦数组
  • 什么样的医疗器械进销存管理软件可以选择?
  • Channel Shuffle通道洗牌
  • ENSP学习day11
  • Angular由一个bug说起之十五:自定义基于Overlay的Tooltip
  • 未来AI视觉艺术,会替代人类设计师吗?
  • Flink中聚合算子介绍
  • spring security 认证流程分析
  • 基于DeepSeek-V2的生物量智能反演系统—从光谱特征挖掘到三维生物量场重建
  • 3.27学习总结 算法题
  • pickle 文件是什么?
  • ngx_conf_parse
  • xpp3_min dowload (xpp_3的安装)
  • MySQL聚簇索引和非聚簇索引 通俗易懂
  • 【C++游戏引擎开发】第1周《线性代数》(1):环境配置与基础矩阵类设计
  • pyqt 信号与槽
  • 生物中心论
  • mysqlworkbench导入.sql文件
  • Linux应用:线程基础
  • MATLAB中iscell函数用法
  • 知名响应式网站企业/网页制作公司哪家好
  • dede女性网站源码/网络营销课程
  • 国内最新新闻摘抄30字/东莞seo代理
  • 保险网站建设公司/促销策略的四种方式
  • 江苏宜安建设有限公司网站/搜索引擎优化的步骤
  • 做公司网站员工保险/太原seo网络优化招聘网