当前位置: 首页 > 工具软件 > uCrop > 使用案例 >

android使用ucrop实现头像裁剪,图片裁剪的使用

熊锐进
2023-12-01

github地址  https://github.com/linliangliang/CorpIamge

uCrop 支持缩放图片,旋转图片,改变裁剪长宽比例,支持出手势:一根指头滑动图片,两根指头旋转图片,捏拉缩放,双击缩放。等功能。对于裁剪头像的需求基本满足。

下面记录在学习头像裁剪的笔记,以及一个上传到git的demo。

1、依赖添加

//项目中的build.gradle
allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

//App中的build.gradle
compile 'com.github.yalantis:ucrop:2.2.1'

2、权限申请(android6.0及以上需要动态申请权限,我在其他博客中也写过这么不再贴,可以在github中查看)

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!--允许读取手机状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.VIBRATE" />

3、开始写代码

3.1 在androidmanifest.xml中注册裁剪图片的activity

<!--android:screenOrientation="portrait"表示竖屏-->
<activity
    android:name="com.yalantis.ucrop.UCropActivity"
    android:screenOrientation="portrait"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar" />

3.2 图片有两种方式获取,从图库选择,或者拍照

/**
     * 从相册选择图片
     *
     * @param activity
     */
    public static void choosePhoto(Activity activity) {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_PICK);//打开图库
        //REQUEST_PICTURE_CHOOSE表示请求参数,是个常量
        activity.startActivityForResult(intent, REQUEST_PICTURE_CHOOSE);
    }

    /**
     * 打开相机拍照
     *
     * @param activity
     * @return
     */
    public static void openCamera(Activity activity) {
        //CROPIMAGEROOT是我为app建立的一个根目录文件夹,
        //定义方式:
        //private final static String CROPIMAGEROOT = Environment.getExternalStorageDirectory() + "/myAppName/";
        //当然这个目录需要自己创建,可以下载demo查看

        //mPictureFile 拍照后图片保存的文件。
        mPictureFile = new File(CROPIMAGEROOT, "_" + System.currentTimeMillis() + ".jpg");
        imageUri = Uri.fromFile(mPictureFile);
        // 启动拍照,并保存到临时文件
        Intent mIntent = new Intent();
        mIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        mIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mPictureFile));
        mIntent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
        activity.startActivityForResult(mIntent, REQUEST_CAMERA_IMAGE);
    }

其中注释已经横清楚了

 

3.3选择图片后在 ActivityforResult()中调用裁剪图片的方法,裁剪完后,还是在 ActivityforResult()对裁剪后的结果进行处理。

这里直接贴出整个ActivityforResult()

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {

            //相册
            case REQUEST_PICTURE_CHOOSE:
                if (resultCode == RESULT_OK) {
                    Uri sourceUri = data.getData();
                    startUCrop(sourceUri);

                } else {
                    Toast.makeText(this, "选图失败!", Toast.LENGTH_SHORT).show();
                }
                break;
            //照相
            case REQUEST_CAMERA_IMAGE:
                if (resultCode == RESULT_OK) {
                    if (data != null) {
                        startUCrop(imageUri);
                    } else {
                        Toast.makeText(this, "拍照失败!", Toast.LENGTH_SHORT).show();
                    }
                }
                break;
            //裁剪后的效果
            case UCrop.REQUEST_CROP:
                if (resultCode == RESULT_OK) {
                    Uri resultUri = UCrop.getOutput(data);
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(resultUri));
                        avatarImage.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            //错误裁剪的结果
            case UCrop.RESULT_ERROR:
                if (resultCode == RESULT_OK) {
                    final Throwable cropError = UCrop.getError(data);
                    handleCropError(cropError);
                }
                break;
        }
    }

3.4 实现图片裁剪的函数

     /**
     * 裁剪图片
     *
     * @param sourceUri
     */
    private void startUCrop(Uri sourceUri) {
        UCrop.Options options = new UCrop.Options();
        //裁剪后图片保存在文件夹中
        Uri destinationUri = Uri.fromFile(new File(CROPIMAGEROOT, "uCrop.jpg"));
        UCrop uCrop = UCrop.of(sourceUri, destinationUri);//第一个参数是裁剪前的uri,第二个参数是裁剪后的uri
        uCrop.withAspectRatio(1, 1);//设置裁剪框的宽高比例
        //下面参数分别是缩放,旋转,裁剪框的比例
        options.setAllowedGestures(com.yalantis.ucrop.UCropActivity.ALL, com.yalantis.ucrop.UCropActivity.NONE, com.yalantis.ucrop.UCropActivity.ALL);
        options.setToolbarTitle("移动和缩放");//设置标题栏文字
        options.setCropGridStrokeWidth(2);//设置裁剪网格线的宽度(我这网格设置不显示,所以没效果)
        //options.setCropFrameStrokeWidth(1);//设置裁剪框的宽度
        options.setMaxScaleMultiplier(3);//设置最大缩放比例
        //options.setHideBottomControls(true);//隐藏下边控制栏
        options.setShowCropGrid(true);  //设置是否显示裁剪网格
        //options.setOvalDimmedLayer(true);//设置是否为圆形裁剪框
        options.setShowCropFrame(true); //设置是否显示裁剪边框(true为方形边框)
        options.setToolbarWidgetColor(Color.parseColor("#ffffff"));//标题字的颜色以及按钮颜色
        options.setDimmedLayerColor(Color.parseColor("#AA000000"));//设置裁剪外颜色
        options.setToolbarColor(Color.parseColor("#000000")); // 设置标题栏颜色
        options.setStatusBarColor(Color.parseColor("#000000"));//设置状态栏颜色
        options.setCropGridColor(Color.parseColor("#ffffff"));//设置裁剪网格的颜色
        options.setCropFrameColor(Color.parseColor("#ffffff"));//设置裁剪框的颜色
        uCrop.withOptions(options);
        /*//裁剪后保存到文件中
        Uri destinationUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/myxmpp/" + "test1.jpg"));
        UCrop uCrop = UCrop.of(sourceUri, destinationUri);
        UCrop.Options options = new UCrop.Options();
        //设置裁剪图片可操作的手势
        options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
        //设置toolbar颜色
        options.setToolbarColor(ActivityCompat.getColor(this, R.color.orange2));
        //设置状态栏颜色
        options.setStatusBarColor(ActivityCompat.getColor(this, R.color.orange2));
        //是否能调整裁剪框
        options.setFreeStyleCropEnabled(true);
        options.setToolbarWidgetColor(Color.parseColor("#ffffff"));//标题字的颜色以及按钮颜色
        options.setDimmedLayerColor(Color.parseColor("#AA000000"));//设置裁剪外颜色
        options.setToolbarColor(Color.parseColor("#000000")); // 设置标题栏颜色
        options.setStatusBarColor(Color.parseColor("#000000"));//设置状态栏颜色
        options.setCropGridColor(Color.parseColor("#ffffff"));//设置裁剪网格的颜色
        options.setCropFrameColor(Color.parseColor("#ffffff"));//设置裁剪框的颜色
        //options.setShowCropFrame(false); //设置是否显示裁剪边框(true为方形边框)

        uCrop.withOptions(options);*/
        uCrop.start(this);
    }

实现裁剪可以定制不同的功能,注释写的很清楚,这里不再赘述。可以自己修改,慢慢查看运行效果。

其中UCrop uCrop = UCrop.of(sourceUri, destinationUri);//第一个参数是裁剪前的uri,第二个参数是裁剪后的uri。

完成裁剪之后,在ActivityforResult()中将图片显示在某个imageView中。

 

这个好像不支持圆形图片的裁剪。稍后将介绍另一种库实现圆形图片的裁剪

github地址  https://github.com/linliangliang/CorpIamge

 类似资料: