使用Jcrop.js剪切图片因图片太大导致精准度丢失的解决办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Jcrop.js剪切图片因图片太大导致精准度丢失的解决办法相关的知识,希望对你有一定的参考价值。

一、我在写一个头像上传剪切的demo时遇到了这个问题,正常大小的图片通过maxwidth设置后不会有问题,但是当上传图片太大时,由于被缩放导致Jcrop剪切时获取的不是实际剪切位置,因此需要按比例计算所剪切的图片大小

 

  html代码

  1 <%@ page language="java" contentType="text/html; charset=utf-8"%>
  2 <%@ taglib prefix="s" uri="/struts-tags"%>
  3 <html>
  4     <head>
  5         <title>保存头像</title>
  6         <script src="js/jquery.min.js" type="text/javascript"></script>
  7         <script src="js/jquery.Jcrop.js" type="text/javascript"></script>
  8         <link rel="stylesheet" href="css/bootstrap.min.css" />
  9         <link rel="stylesheet" href="css/bootstrapValidator.min.css" />
 10         <link rel="stylesheet" href="css/index.css" />
 11         <link rel="stylesheet" href="css/jquery.Jcrop.css" type="text/css" />
 12         <link rel="stylesheet" href="demo_files/demos.css" type="text/css" />
 13         <style type="text/css">
 14          #target {
 15                     max-width:440px;
 16                     max-height:400px;
 17                     margin-right: 15px;
 18                 }
 19         
 20         </style>
 21     </head>
 22     
 23 
 24     <body>
 25 
 26         <script type="text/javascript">
 27 
 28 
 29         </script>
 30 
 31         <table align="center" width="50%">
 32             <tr>
 33                 <td>
 34                     <s:fielderror cssStyle="color:red" />
 35                 </td>
 36             </tr>
 37         </table>
 38         
 39         <s:form action="upload.action" theme="simple" method="post"
 40             enctype="multipart/form-data" onsubmit="return checkCoords();">
 41 
 42             <table align="center" width="50%" border="0" id="table_upload">
 43                 <tr>
 44                     <td>
 45                         上传头像
 46                     </td>
 47                     <td id="more" >
 48                         <s:file name="upload" onchange="submit();" labelSeparator="sd"></s:file>
 49                         
 50                     </td>
 51                 </tr>
 52             </table>
 53 
 54         </s:form>
 55         <input type="text" value="${realName }" id="flag_img" style="display: none;"/>
 56         <table id="table_img" align="center">
 57             <tr>
 58                 <td>
 59                     <img src="upload/file/${realName }" width="440px" height="400px" id="target" alt="Flowers" onload=""/>
 60                     
 61                 </td>
 62                 <td>
 63                     <div style="width:100px;height:100px;overflow:hidden;">
 64                         <img src="upload/file/${realName }" width="100px" height="100px" id="preview" alt="Preview" />
 65                     </div>
 66                 </td>
 67                     <td>
 68                     <form action="user!SaveImage.action">
 69                             <input type="hidden" id="x" name="x">
 70                              <input type="hidden" id="y" name="y">
 71                              <input type="hidden" id="w" name="w">
 72                               <input type="hidden" id="h" name="h">
 73                               <input type="hidden" id="realW" name="realW"/>
 74                             <input type="hidden" id="realH" name="realH"/>
 75                       <div class="col-lg-12" style="width: 100%;" id="btn_sub">
 76                           <button type="submit" class="btn btn-lg btn-primary btn-block">保存头像</button>
 77                       </div>
 78                   </form>
 79                   </td>
 80             </tr>
 81             
 82         </table>
 83     </body>
 84     <script type="text/javascript">
 85     //测试代码
 86     $(document).ready(function(){
 87         if (($("#flag_img").val()=="") || ($("#flag_img").val()==null)) {
 88             $("#table_img").css("display", "none");
 89             $("#btn_sub").css("display", "none");
 90             $(#w).val(20);
 91         }else{
 92             $("#table_img").css("display", "block");
 93             $("#btn_sub").css("display", "block");
 94             $(#w).val("");
 95         }
 96     });
 97     
 98     //剪切核心代码
 99     jQuery(function($){
100 
101       // 创建jcrop对象,图片原尺寸
102       var jcrop_api, boundx, boundy;
103       
104       $(#target).Jcrop({
105         onChange: updatePreview,
106         onSelect: updatePreview,
107         aspectRatio: 0
108       },function(){
109         // 原尺寸
110         var bounds = this.getBounds();
111         boundx = bounds[0];
112         boundy = bounds[1];
113         $(#realW).val(boundx);
114         $(#realH).val(boundx);
115         // 得到jcrop_api
116         jcrop_api = this;
117       });
118 
119       function updatePreview(c)
120       {
121         if (parseInt(c.w) > 0)
122         {
123           var rx = 100 / c.w;
124           var ry = 100 / c.h;
125           updateCoords(c);
126           $(#preview).css({
127             width: Math.round(rx * boundx) + px,
128             height: Math.round(ry * boundy) + px,
129             marginLeft: - + Math.round(rx * c.x) + px,
130             marginTop: - + Math.round(ry * c.y) + px
131           });
132         }
133       };
134 
135     });
136         function updateCoords(c){
137           $(#x).val(c.x);
138           $(#y).val(c.y);
139           $(#w).val(c.w);
140           $(#h).val(c.h);
141         };
142           
143         function checkCoords(){
144           if (parseInt($(#w).val())) {
145             return true;
146           };
147           alert(请先选择要裁剪的区域后,再提交。);
148           return false;
149         };
150   </script>
151 
152 </html>

  java代码

/**
     * 保存头像
     * @return
     * @throws IOException    流未找到
     */
    public String SaveImage() throws IOException{
        File file=(File) session.getAttribute("fileImage");    //得到源文件
        
        Double fileX=ImageIO.read(file).getWidth()/Double.parseDouble(realW);    //缩放比例X轴
        Double fileY=ImageIO.read(file).getHeight()/Double.parseDouble(realH);    //缩放比例Y轴
        
        int newX=(int) (Double.parseDouble(x)*fileX);
        int newY=(int) (Double.parseDouble(y)*fileY);
        int newW=(int) (Double.parseDouble(w)*fileX);
        int newH=(int) (Double.parseDouble(h)*fileY);        //通过缩放比例计算实际剪切尺寸
        
        UserDao dao=new UserDao();
        User user=(User) session.getAttribute("user");        //得到用户对象
        
        String src=UploadConfigurationRead.getInstance()
                .getConfigItem("uploadFilePath").trim()
                +"/"
                +(String)session.getAttribute("realName");        //剪切文件存放位置
        user.setUserImage(src);        //头像文件名称
        String type=(String) session.getAttribute("type");        //文件后缀,根据不同图片格式调用不同图片文件流
        //调用工具类剪切图片
        ImageHelper.cutImage(file.getAbsolutePath(),file.getAbsolutePath(),newX,newY,newW,newH,type);
        //向数据库中存入数据
        if (dao.UpdateUserImage(user)>0) {            
            return "SaveSUCCESS";
        }
        return Action.ERROR;
    }
ImageHelper.cutImage()方法
/**
     * 图片剪切接口
     * @param src    原图片地址
     * @param dest    剪切后图片地址
     * @param x    
     * @param y
     * @param w
     * @param h
     * @param imageTTF    文件后缀/格式
     * @throws IOException
     */
    public static void cutImage(String src,String dest,int x,int y,int w,int h,String imageTTF) throws IOException{ 
           Iterator iterator = ImageIO.getImageReadersByFormatName(imageTTF);
           ImageReader reader = (ImageReader)iterator.next(); 
           InputStream in=new FileInputStream(src);
           ImageInputStream iis = ImageIO.createImageInputStream(in); 
           reader.setInput(iis, true); 
           ImageReadParam param = reader.getDefaultReadParam(); 
           Rectangle rect = new Rectangle(x, y, w,h);  
           param.setSourceRegion(rect); 
           BufferedImage bi = reader.read(0,param);   
           ImageIO.write(bi, "jpg", new File(dest));           

    } 

剪切图片

技术分享

实际效果技术分享

 

以上是关于使用Jcrop.js剪切图片因图片太大导致精准度丢失的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

图片裁剪上传Jcrop

解决使用 libjpeg 保存图片时因磁盘写入失败导致程序退出的问题

jcrop+java 后台

我由于收集太多图片导致虚拟内存不足

裁剪刚刚添加了一张图片

将matlab的figure保存为pdf,避免图片太大缺失