使用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));           

    } 

剪切图片

实际效果

 
时间: 2024-12-24 09:24:27

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

js数字位数太大导致参数精度丢失问题

最近遇到个比较奇怪的问题,js函数里传参,传一个位数比较大,打印arguments可以看到传过来的参数已经改变. 然后查了一下,发现确实是js精度丢失造成的.我的解决方法是将数字型改成字符型传输,这样就不会造成精度丢失了.如下图: JS 数字丢失精度的原因 计算机的二进制实现和位数限制有些数无法有限表示.就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等.JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bi

分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据

原文:分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 今天开发找我,说数据库insert不进数据,叫我看一下 他发了一个截图给我 然后我登录上服务器,发现了可疑的地方,而且这个数据库之前有一段经历 在月初的时候这个数据库曾经置疑过,启动不起来 Could not redo log record (163041:116859:5), for transaction ID (0:-1175226963), on

js报TypeError $(...) is null错误,jquery失效的原因及解决办法

最近在工作中发现个问题,原本好好的网页,写了一些自己的jquery代 码之后,竟然总是不起作用,无论写的多么简单,都不起作用,似乎jquery失效了一般,在火狐下调试看了下,页面报TypeError $(...) is null这种错误,找了半天原因最后发现竟是页面中加载的一个插件给捣的鬼,是它将jquery的$方法给覆盖了.对于这个问题,现在分享两种解决方法. (1)删冲突插件,jquery作为基础库,当然是没有理由被删了.这个方法最直接了. (2)将jquery的$方法改名,具体改名方法如下

Asp.net 从Excel读取图片并保存,无法从内存读取图片,Excel组件和相关IIS的配置及解决办法

</pre>目的:Asp.net web页面,读取Excel,(用的office组件),中的图片注意的事项:<p></p><p>只提供部分代码,因为重点是配置.</p><p>1:要想从Excel里读取图片,只能用剪贴板的方面将图片复制到内存然后再保存图片.</p><p>2:剪贴板的使用要引用WinForm</p><p>3: Excel是单线程的方式,所以代码里使用剪贴板也要用单线程的方式

关于移动端js弹出层滚动的时候 body层不可滚动的解决办法

最近在做移动端网站,在点击导航栏,弹出导航列表时,出现了问题.下滑列表时底层body也跟着滚动,连查带想的折腾了两天才解决这个问题.下面主要分享一下解决办法以及关键代码. 一.有的网友建议弹出层弹出时给 html 和 body 都加上"height:100%:overflow:hidden:",然而在手机上并没有什么卵用 二.结合弹出层加上"overflow-y:auto"依然不起作用 .... 后来经过网友的帮助,结合我的代码终于找到了解决的办法 我的项目是用vu

.net项目中上传的图片或者文件太大 无法上传

最近做项目的时候  用户提出要上传大图片  一张图片有可能十几兆  本来用的第三方的上传控件  有限制图片上传大小的设置 以前设置的是2M  按照用户的要求  以为直接将限制图片上传大小的设置改下就可以了  但是当上传大图片的时  总是异常: 错误消息:超过了最大请求长度 解决方案: 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 修改web.config中配置 <configuration> <system.web> <httpRuntime u

移动端js弹出层滚动的时候 body层不可滚动的解决办法

原文:https://blog.csdn.net/queenzjl/article/details/53507661 一.有的网友建议弹出层弹出时给 html 和 body 都加上"height:100%:overflow:hidden:",然而在手机上并没有什么卵用 二.结合弹出层加上"overflow-y:auto"依然不起作用 三.加上touchmove事件:window.ontouchmove = function(e){e.preventDefault()

js连续指定两次或者多次的click事件(解决办法)

setTimeout (表达式,延时时间)setTimeout(表达式,交互时间)延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTimeout  在执行时,是在载入后延迟指定时间后,去执行一次表达式,仅执行一次setTimeout 在执行时,它从载入后,每隔指定的时间就执行一次表达式 if(ischoose == false){ ischoose = true; document.getElementById("myBaby").click(); } else { d

JS各种iframe弹出控件没有滚动条或者失灵的解决办法

举例: easyui panel layer 多数的配置是 iframe : true 或者 iframeScrolling:true ,但是设置后滚动条仍然失灵 解决办法,在iframe页面 中加入框架DIV style设置为 width=100%;height=100%;overflow:auto; 原文链接 作程的博客 http://www.zuocheng.net/it/?p=208