zoukankan      html  css  js  c++  java
  • 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;
    
        }
    
    
    }
  • 相关阅读:
    机器学习入门:线性回归及梯度下降
    torch7入门(安装与使用)
    机器学习--详解人脸对齐算法SDM-LBF
    人脸对齐和应用
    如何使用Unity制作虚拟导览(一)
    fatal error C1083: Cannot open include file: 'qttreepropertybrowser.moc': No such file or directory
    在QTreeWidget中删除QTreeWidgetItem
    如何写一个简单的手写识别算法?
    面向对象编程的弊端是什么?
    神舟飞船上的计算机使用什么操作系统,为什么是自研发不是 Linux?
  • 原文地址:https://www.cnblogs.com/qfdy123/p/11397306.html
Copyright © 2011-2022 走看看