Jcrop图片裁剪

一、引入js和css

二、实现

1、jsp页面

<%--
  Created by IntelliJ IDEA.
  User: a
  Date: 2019/8/19
  Time: 9:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" type="text/css" href="js/jquery.Jcrop.min.css">
    <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript" src="js/Jcrop_upload.js"></script>
    <script type="text/javascript" src="js/jquery.Jcrop.min.js"></script>

</head>
<body>

<form id="upload_form" enctype="multipart/form-data" method="post" action="${pageContext.request.contextPath}/user/upLoadImage.do" >
    <!-- hidden crop params -->
    <input type="hidden" id="x1" name="x1" />
    <input type="hidden" id="y1" name="y1" />
    <input type="hidden" id="x2" name="x2" />
    <input type="hidden" id="y2" name="y2" />

    <p>第一步:请选择图像文件</p>
    <div><input type="file" name="image_file" id="image_file" onchange="fileSelectHandler()" /></div>

    <div class="error"></div>

    <div class="step2">
        <p>第二步:请选择需要截图的部位,然后按上传</p>
        <img id="preview" >
        <br>


        <input type="submit" value="上传" />
    </div>
</form>


</body>
</html>

2、工具类

package com.zy.utils;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class ImageCut {  
    
    /** 
     * 图片切割 
     * @param imagePath  原图地址 
     * @param x  目标切片坐标 X轴起点 
     * @param y  目标切片坐标 Y轴起点 
     * @param w  目标切片 宽度 
     * @param h  目标切片 高度 
     */  
    public static  void cutImage(String imagePath, int x ,int y ,int w,int h){  
        try {  
            Image img;  
            ImageFilter cropFilter;  
            // 读取源图像  
            BufferedImage bi = ImageIO.read(new File(imagePath));  
            int srcWidth = bi.getWidth();      // 源图宽度  
            int srcHeight = bi.getHeight();    // 源图高度  
              
            //若原图大小大于切片大小,则进行切割  
            if (srcWidth >= w && srcHeight >= h) {  
                Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);  
                  
                //如果jsp页面上展示的是原图的大小,那么此处就不计算起始坐标和宽高了,直接裁剪
                int x1 = x;  
                int y1 = y;  
                int w1 = w;  
                int h1 = h;  
                  
                cropFilter = new CropImageFilter(x1, y1, w1, h1);  
                img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));  
                BufferedImage tag = new BufferedImage(w1, h1,BufferedImage.TYPE_INT_RGB);  
                Graphics g = tag.getGraphics();  
                g.drawImage(img, 0, 0, null); // 绘制缩小后的图  
                g.dispose();  
                // 输出为文件  
                ImageIO.write(tag, "JPEG", new File(imagePath));  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}   

3、controller

package com.zy.controller;

import com.zy.utils.ImageCut;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.UUID;

@Controller
@RequestMapping("user")
public class ImageController {

    @RequestMapping("/upLoadImage")
    public void upimage(Double x1,Double x2,Double y1,Double y2,HttpServletRequest request,MultipartFile image_file ){//包装类

        Boolean isCut=false;//不裁剪
        if (x2!=null&&x2!=0){//如果x2有值,说明横坐标终点发生变化,用户使用了裁剪
            //截取的宽度
            isCut=true;
        }

        //图片上传
        String path="/img";
        String realPath = myGetRealPath(path, request);
        String newFileName = newFileName(image_file);

        //上传----把本地文件按流的方式copy到服务器上

        //输入流
        InputStream is = null;
        try {
            is = image_file.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //输出流
        FileOutputStream os = null;
        try {
            os = new FileOutputStream(realPath+"/"+newFileName);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        //copy
        try {
            IOUtils.copy(is, os);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            os.close();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        int i1=x1.intValue();
        int i2=x2.intValue();
        int i3=y1.intValue();
        int i4=y2.intValue();

        //3图片裁剪
        if(isCut){
            ImageCut.cutImage(realPath+"/"+newFileName,i1,i3,i2-i1,i4-i3);
        }


    }

    //辅助方法
    //1根据逻辑路径得到真实路径
    //过期的
    //@SuppressWarnings(“deprecation”)表示不检测过期的方法
    @SuppressWarnings("deprecation")
    public String myGetRealPath(String path, HttpServletRequest request){
        String realPath = request.getRealPath(path);
        System.out.println("真实路径:"+realPath);
        File file = new File(realPath);
        if(!file.exists()){
            file.mkdirs();
        }


        return realPath;
    }

    //2更改文件名
    public String newFileName(MultipartFile file){
        String originalFilename = file.getOriginalFilename();
        //abc.jpg
        //截取后缀,拼接新的文件名
        //后缀
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
        //新文件名要求:上传中防止文件名重复,发生覆盖
        String uu = UUID.randomUUID().toString();

        String newName=uu+substring;
        return newName;

    }


}

 

posted @ 2019-08-22 22:39  勤奋的园  阅读(348)  评论(0编辑  收藏  举报