裁剪

场景

  • 拍照->裁剪->显示
  • 相册选->裁剪->显示

原生

/**
 * 图裁剪
 *
 * @param uri 统一资源标识符
 */
public void imageCrop(Uri uri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    // aspectX aspectY 宽高比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    // outputX outputY 裁剪图宽高
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, REQUEST_CROP);
}

/**
 * 存裁剪后图至本地并回调至画板
 *
 * @param bitmap bitmap
 */
private void dealWithBitmap(Bitmap bitmap) {
    if (bitmap != null) {
        String sdStatus = Environment.getExternalStorageState();
        // SDCard可用否
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
            return;
        }
        FileOutputStream b = null;
        File file = new File(value.Folder.WHITE_BOARD_PICTURE_CROP);
        if (!file.exists()) {
            file.mkdirs();
        }
        // 图名
        String fileName = value.Folder.WHITE_BOARD_PICTURE_CROP + UUID.randomUUID() + ".jpg";
        try {
            b = new FileOutputStream(fileName);
            // 写数据到文件
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关流
                if (b != null) {
                    b.flush();
                    b.close();
                }
                if (callback != null) {
                    File imgFile = new File(fileName);
                    callback.onCameraShot(imgFile);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

crop

  • ProjectGradle
    maven { url "https://jitpack.io" }
    allprojects {
            repositories {
                jcenter()
                maven { url "https://jitpack.io" } /*6.0动申权限*/
            }
        }
    
  • ModuleGradle
    compile 'com.github.jokermonn:permissions4m:2.1.1-lib'/*6.0动申权限*/
    annotationProcessor 'com.github.jokermonn:permissions4m:2.1.1-processor'/*6.0动申权限*/
    compile('com.kevin:crop:1.0.2') {/*图像剪切*/
        exclude group: 'com.android.support', module: 'appcompat-v7'/*引support:appcompat-v7可加该句*/
    }
    

uCrop

原生
public static String PRACTICE_IN_CLASS_CROP_PICTURE = Environment.getExternalStorageDirectory().getAbsolutePath() + "/bte/PracticeInClass/CropPicture/";

File outDir = new File(Folder.PRACTICE_IN_CLASS_CROP_PICTURE);
if (!outDir.exists()) {
    outDir.mkdirs();
}
File outFile = new File(outDir, System.currentTimeMillis() + ".png");
Uri destination = Uri.fromFile(outFile);

UCrop.of(Uri.fromFile(new File(list.get(0))), destinationUri)
        .withAspectRatio(16, 9)
        .withMaxResultSize(360, 180)
        .start(this);
                                
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {    
            case UCrop.REQUEST_CROP:
                if (data != null) {
                    GlideLoader.displayByUriPlaceHolderColor(this, UCrop.getOutput(data), R.color.transparent, iv);
                }
                break;
            case UCrop.RESULT_ERROR:
                if (data != null) {
                    Throwable throwable = UCrop.getError(data);
                    if (throwable != null) {
                        LogUtils.e(throwable.getMessage());
                    }
                }
                break;
            default:
                break;
        }
    }
}
封装

CropExecutor

package widget.ucrop;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;

import com.xalikai.bnmdteacherend.R;
import com.yalantis.ucrop.UCrop;

import java.io.File;

/**
 * Created on 2019/3/19.
 *
 * @author 郑少鹏
 * @desc 裁剪执行者
 */
public class CropExecutor {
    /**
     * 活动中裁剪
     *
     * @param activity        上下文
     * @param sourcePath      需裁剪图路径
     * @param destinationPath 目标路径
     * @param maxWidth        最大宽
     * @param maxHeight       最大高
     */
    public static void uCropInActivity(Activity activity, String sourcePath, String destinationPath, int maxWidth, int maxHeight) {
        File outDir = new File(destinationPath);
        if (!outDir.exists()) {
            outDir.mkdirs();
        }
        File outFile = new File(outDir, System.currentTimeMillis() + ".png");
        Uri destinationUri = Uri.fromFile(outFile);
        UCrop.of(Uri.fromFile(new File(sourcePath)), destinationUri)
                .withAspectRatio(16, 9)
                .withMaxResultSize(maxWidth, maxHeight)
                .withOptions(options(activity))
                .start(activity);
    }

    /**
     * 碎片中裁剪
     *
     * @param context         上下文
     * @param fragment        碎片
     * @param sourcePath      需裁剪图路径
     * @param destinationPath 目标路径
     * @param maxWidth        最大宽
     * @param maxHeight       最大高
     */
    public static void uCropInFragment(Context context, Fragment fragment, String sourcePath, String destinationPath, int maxWidth, int maxHeight) {
        File outDir = new File(destinationPath);
        if (!outDir.exists()) {
            outDir.mkdirs();
        }
        File outFile = new File(outDir, System.currentTimeMillis() + ".png");
        Uri destinationUri = Uri.fromFile(outFile);
        UCrop.of(Uri.fromFile(new File(sourcePath)), destinationUri)
                .withAspectRatio(16, 9)
                .withMaxResultSize(maxWidth, maxHeight)
                .withOptions(options(context))
                .start(context, fragment);
    }

    /**
     * 设置
     * <p>
     * 裁剪图操作手势
     * options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
     * 隐底部容器否(默显)
     * options.setHideBottomControls(false);
     * 调裁剪框否
     * options.setFreeStyleCropEnabled(true);
     * 显网格否
     * options.setShowCropGrid(true);
     * 网格色
     * options.setCropGridColor(ContextCompat.getColor(context, R.color.colorPrimary));
     *
     * @param context 上下文
     * @return UCrop.Options
     */
    public static UCrop.Options options(Context context) {
        // 初始UCrop配置
        UCrop.Options options = new UCrop.Options();
        // Toolbar色
        options.setToolbarColor(ActivityCompat.getColor(context, R.color.colorPrimary));
        // 状态栏色
        options.setStatusBarColor(ActivityCompat.getColor(context, R.color.colorPrimary));
        return options;
    }
}

主代码(Activity)

public static String PRACTICE_IN_CLASS_CROP_PICTURE = Environment.getExternalStorageDirectory().getAbsolutePath() + "/bte/PracticeInClass/CropPicture/";
CropExecutor.uCropInActivity(this, list.get(0), Folder.PRACTICE_IN_CLASS_CROP_PICTURE, 360, 180);

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {    
            case UCrop.REQUEST_CROP:
                if (data != null) {
                    GlideLoader.displayByUriPlaceHolderColor(this, UCrop.getOutput(data), R.color.transparent, iv);
                }
                break;
            case UCrop.RESULT_ERROR:
                if (data != null) {
                    Throwable throwable = UCrop.getError(data);
                    if (throwable != null) {
                        LogUtils.e(throwable.getMessage());
                    }
                }
                break;
            default:
                break;
        }
    }
}

主代码(Fragment)

public static String COURSE_RESOURCE_UPLOAD_CROP_PICTURE = Environment.getExternalStorageDirectory().getAbsolutePath() + "/bte/CourseResourceUpload/CropPicture/";
CropExecutor.uCropInFragment(getContext(), this, list.get(0), Folder.COURSE_RESOURCE_UPLOAD_CROP_PICTURE, 360, 180);

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {    
            case UCrop.REQUEST_CROP:
                if (data != null) {
                    GlideLoader.displayByUriPlaceHolderColor(this, UCrop.getOutput(data), R.color.transparent, iv);
                }
                break;
            case UCrop.RESULT_ERROR:
                if (data != null) {
                    Throwable throwable = UCrop.getError(data);
                    if (throwable != null) {
                        LogUtils.e(throwable.getMessage());
                    }
                }
                break;
            default:
                break;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snpmyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值