cropper如何进行对头像的剪切

前端使用的cropper 后端使用的springmvc,文件上传使用的是七牛云存储. 也可以存到本地

前言(解析一波):前端剪切好头像时,会把原图以及剪切的四个点传到后端.然后后端才是真正的对图片进行剪切.

项目源码:点击打开链接     (大二学生.写的有点渣,轻喷...   刚玩这些东西.多多指教)

前端操作:

前端主要代码:

<div class="modal fade" id="avatar-modal" aria-hidden="true" aria-labelledby="avatar-modal-label"
                 role="dialog"
                 tabindex="-1">
                <div class="modal-dialog modal-lg">
                    <div class="modal-content">
                        <form class="avatar-form" action="/user/uploadHeadImg" enctype="multipart/form-data"
                              method="post">
                            <div class="modal-header">
                                <button class="close" data-dismiss="modal" type="button">×</button>
                                <h4 class="modal-title" id="avatar-modal-label">修改头像</h4>
                            </div>
                            <div class="modal-body">
                                <div class="avatar-body">

                                    <!-- Upload image and data -->
                                    <div class="avatar-upload">
                                        <input class="avatar-src" name="avatar_src" type="hidden">
                                        <input class="avatar-data" name="avatar_data" type="hidden">
                                        <label for="avatarInput">本地上传</label>
                                        <input class="avatar-input" id="avatarInput" name="avatar_file" type="file">
                                    </div>

                                    <!-- Crop and preview -->
                                    <div class="row">
                                        <div class="col-md-9">
                                            <div class="avatar-wrapper"></div>
                                        </div>
                                        <div class="col-md-3">
                                            <div class="avatar-preview preview-lg">
                                                <img src="" class="user_head_img">
                                            </div>
                                            <div class="avatar-preview preview-md">
                                                <img src="" class="user_head_img">
                                            </div>
                                            <div class="avatar-preview preview-sm">
                                                <img src="" class="user_head_img">
                                            </div>
                                        </div>
                                    </div>

                                    <div class="row avatar-btns">
                                        <div class="col-md-3">
                                            <button class="btn  btn-info" type="submit">提交</button>
                                            <button class="btn  btn-warning" data-dismiss="modal" type="button">关闭
                                            </button>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="modal-footer">

                            </div>
                        </form>
                    </div>
                </div>
            </div><!-- /.modal -->
前端具体源码可参考 点击打开链接


后端操作:

主要实现在后台,前端的就不多bb了.

后台springmvc接受数据:注意看这里的注释

@RequestMapping(value = "/uploadHeadImg", method = RequestMethod.POST, produces="text/html;charset=utf-8")
    @ResponseBody
    public String uploadHeadImg(
            @RequestParam(value = "avatar_file", required = false) MultipartFile avatar_file,
            String avatar_src, String avatar_data, HttpServletRequest request) {
        if(!avatar_file.getContentType().contains("image")){
            return "请选择正确的图片格式!";
        }
        JsonParser parse =new JsonParser();                             //获取图片截取数据   JSON:com.google.gson.JsonParser

        JsonObject json=(JsonObject) parse.parse(avatar_data);
        int x = Math.round(json.get("x").getAsFloat());
        int y = Math.round(json.get("y").getAsFloat());
        int w = Math.round(json.get("width").getAsFloat());
        int h = Math.round(json.get("height").getAsFloat());
        int r = Math.round(json.get("rotate").getAsFloat());
        File file;
        try {
            file = new File("d:/image",currentUser.getToken()+".png");    //存储临时文件  暂存在d盘下的image 方便调试
            InputStream is = avatar_file.getInputStream();                   
            ImageUtil.cut(is,file,x,y,w,h);                                //主要类ImageUtil(自定义的):图片工具类对图片进行操作
            userService.uploadHeadImg(file);                                //调用七牛云上传图片接口
            file.delete();                                                //删除文件
        } catch (IOException e) {
            e.printStackTrace();
            return "失败!";
        }
        return "成功!";
    }

图片处理类ImageUtil:参考别人的博客,改了一点东西.

public static void cut(InputStream is, File dirImageFile, int x, int y, int destWidth,
                           int destHeight) throws IOException {
        cut(ImageIO.read(is),dirImageFile,x,y,destWidth,destHeight);
    }
    public static void cut(BufferedImage bi,File dirImageFile, int x, int y, int destWidth,
                           int destHeight) {
        try {
            Image img;
            ImageFilter cropFilter;
            // 读取源图像
            int srcWidth = bi.getWidth(); // 源图宽度
            int srcHeight = bi.getHeight(); // 源图高度
            if (srcWidth >= destWidth && srcHeight >= destHeight) {
                Image image = bi.getScaledInstance(srcWidth, srcHeight,
                        Image.SCALE_DEFAULT);
                // 改进的想法:是否可用多线程加快切割速度
                // 四个参数分别为图像起点坐标和宽高
                // 即: CropImageFilter(int x,int y,int width,int height)
                cropFilter = new CropImageFilter(x, y, destWidth, destHeight);
                img = Toolkit.getDefaultToolkit().createImage(
                        new FilteredImageSource(image.getSource(), cropFilter));
                BufferedImage tag = new BufferedImage(destWidth, destHeight,
                        BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                g.drawImage(img, 0, 0, null); // 绘制缩小后的图
                g.dispose();
                // 输出为文件
                ImageIO.write(tag, "JPEG", dirImageFile);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

上传七牛云接口    务必导入jar包

<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>[7.2.0, 7.2.99]</version>
</dependency>

public static String uploadHeadImg(File file) throws IOException {
        Configuration cfg = new Configuration(Zone.zone2());
        UploadManager uploadManager = new UploadManager(cfg);
        Auth auth = Auth.create(Const.QINIU_ACCESS_KEY,Const.QINIU_SECRET_KEY);
        String upToken = auth.uploadToken(Const.QINIU_HEAD_IMG_BUCKET_NAME);
        Response response = uploadManager.put(file,null,upToken);
        //解析上传结果
        DefaultPutRet putRet = new Gson().fromJson(response.bodyString(),DefaultPutRet.class);
        return putRet.key;
    }
Const.QINIU_ACCESS_KEY:是你的七牛云的AK
Const.QINIU_SECRET_KEY:是你的七牛云的SK
Const.QINIU_HEAD_IMG_BUCKET_NAME:是你的对象存储的空间名

猜你喜欢

转载自blog.csdn.net/qq_39130032/article/details/80924880
今日推荐