java版本的图片的缩放剪辑(二)

本文介绍了一种利用jQuery UI实现图片在线预览裁剪和缩放效果的方法,包括前端实现原理与具体步骤,适用于需要调整上传图片尺寸的应用场景。

   客户端图片的相关参数的信息分为两个部分的获取的。

   第一部分是获取原始图片的相关信息,来使图片显示正确

   第二部分是通过js控制图片的缩放以及确认要剪辑图片的相关参数。以便将参数传送到服务器端。

   这两个部分只是通过js控制图片的显示,预览最终要裁剪的效果,并没有对服务器上存储的图片进行任何的修改。

如图所示:

 

 

通过图形可以看到,我们这边的技术难点有两个,一个是缩放,另外一个是最终要剪裁的选择框。并且要将缩放的相关参数以及最终剪辑的相关数据提交到后台,我们的后台根据这些参数,对服务器上的图片进行处理。

图片的拖放、缩放、以及裁剪框的大小我们可以使用任何拥有这些功能的控件脚本。这里我使用的是jquery的1.2.6版本,以及他的ui组件。

具体引入如下:

  1.     <script type="text/javascript" src="js/jquery.pack.js"></script>
  2.     <script src="js/ui.core.packed.js" type="text/javascript"></script>
  3.     <script src="js/ui.draggable.packed.js" type="text/javascript"></script>

 

jquery脚本只是基本的js控件库,详细的拖拽、拖放逻辑还是要我们自己编写,这里我编写到一个demo.js脚本中引入项目

  1.         //获取图片大小的方法,在ie下偶尔有问题
  2.         var getSizeImg = function(src)
  3.         {
  4.             var timg = $('<img>').attr('src', src).css({ position: 'absolute', top: '-1000px', left: '-1000px' }).appendTo('body');
  5.             var size = [timg.get(0).offsetWidth, timg.get(0).offsetHeight];
  6.             try { document.body.removeChild(timg[0]); }
  7.             catch (e) { };
  8.             return size;
  9.         };
  10.         //缩放代码
  11.         function bigSmall()
  12.         {
  13.           var size=$(this).attr("id")=="morebig"?0.01:-0.01;
  14.           var value=parseFloat($("#txt_Zoom").val());
  15.           var temp=value+size;
  16.           if(temp<=2)
  17.           {
  18.           $("#txt_Zoom").val((value+size).toString());
  19.           var width=parseInt($("#width").text());
  20.           var height=parseInt($("#height").text());
  21.          $("#img").css({ width:parseInt(width*temp)+ "px", height:parseInt(height*temp) + "px" });
  22.          $("#image").css({ width:parseInt((width*temp))+ "px", height:parseInt((height*temp)) + "px" });
  23.          $("#drop_img").css({ width:parseInt((width*temp))+ "px", height:parseInt((height*temp)) + "px" });
  24.          $("#txt_width").val($("#img").css("width").replace(/px/,""));
  25.          $("#txt_height").val($("#img").css("height").replace(/px/,""));
  26.          $(".child").css({left:parseInt($(".child").eq(0).css("left").replace(/px/,""))+size*100+"px"});
  27.          }
  28.         }
  29.         //初始化
  30.         $(document).ready(
  31.           function()
  32.         {
  33.             var width = parseInt($("#width").text())//图片的原长宽
  34.             var height = parseInt($("#height").text());
  35.             //将图片长宽输入textbox中
  36.             $("#txt_DropWidth").val($("#drop").css("width").replace("px",""));
  37.             $("#txt_DropHeight").val($("#drop").css("height").replace("px"""));
  38.             
  39.               $("#drop_img").css({left:"-101px",top:"-101px"});//将截取框内的图片移动到适合位置,注意截取框的1px边框
  40.               //设置div的拖动功能
  41.               $("#image").draggable({ cursor: 'move',
  42.                   drag: function(e, ui)
  43.                   {
  44.                       var self = $(this).data("draggable");
  45.                       var drop_img = $("#drop_img");
  46.                       var top = $("#drop_img").css("top").replace(/px/,"");//取出截取框到顶部的距离
  47.                       var left = $("#drop_img").css("left").replace(/px/,"");//取出截取框到左边的距离
  48.                       drop_img.css({left:(parseInt(self.position.left)-101)+"px",top:(parseInt(self.position.top)-101)+"px"});//同时移动内部的图片
  49.                       //drop_img.style.backgroundPosition = (self.position.left - parseInt(left)-1) + 'px ' + (self.position.top - parseInt(top)-1) + 'px';
  50.                       $("#txt_left").val(99-parseInt($(this).css("left")));
  51.                       $("#txt_top").val(99-parseInt($(this).css("top")));
  52.                   }
  53.               });
  54.               
  55.               $("#drop_img").draggable(
  56.                             { cursor: 'move',
  57.                                 drag: function(e, ui)
  58.                                 {
  59.                                     var self = $(this).data("draggable");
  60.                                     var divimage=$("#image");
  61.                                     //divimage.style.backgroundPosition = parseInt((self.position.left))*300 + 'px ' + parseInt((self.position.top))*300 + 'px';
  62.                                     divimage.css({left:(parseInt(self.position.left)+101)+"px" ,top:(parseInt(self.position.top)+101)+"px"});//同时移动div
  63.                                     
  64.                                      $("#txt_left").val(99-parseInt($("#image").css("left")));
  65.                                      $("#txt_top").val(99-parseInt($("#image").css("top")));
  66.                                 }
  67.                             });
  68.               $("#image").css({ opacity: 0.3,backgroundColor:"#fff",width: width + "px", height: height + "px" });
  69.               $("#txt_top").val("100");
  70.               $("#txt_left").val("100");
  71.               $("#txt_width").val(width);
  72.               $("#txt_height").val(height);
  73.               $(".smallbig").click(bigSmall);
  74.               //缩放的代码
  75.               $(".child").draggable(
  76.               {
  77.                 cursor:"move",containment:$("#bar"),
  78.                 drag:function(e,ui)
  79.                      {
  80.                        var left=parseInt($(this).css("left"));
  81.                        var value=1+(left-100)/100;
  82.                        $("#txt_Zoom").val(value);
  83.                        $("#img,image").css({ width:parseInt(width*value)+ "px", height:parseInt(height*value) + "px" });
  84.                        $("#image").css({ width:parseInt(width*value)+ "px", height:parseInt(height*value) + "px"});
  85.                        $("#drop_img").css({ width:parseInt(width*value)+ "px", height:parseInt(height*value) + "px"});
  86.                        $("#txt_width").val($("#img").css("width").replace(/px/,""));
  87.                        $("#txt_height").val($("#img").css("height").replace(/px/,""));
  88.                      }                      
  89.               });
  90.               
  91.           }
  92.         );

 

同时我将提供一个css文件demo.css来将我们页面的基础样式定义好

  1.  html{filter: expression(document.execCommand("BackgroundImageCache"falsetrue));}
  2.         body{ width:955px; text-align:left;}
  3.         #content
  4.         {cursor: pointer; position: relative;width: 320px;height: 320px; border: 1px solid #ccc;overflow: hidden;background-color:#bbb;}
  5.         #drop{border: 1px solid #ccc;width: 120px;height: 160px;cursor: pointer;position: absolute;top: 100px; left: 100px;overflow: hidden;}
  6.         #drop_img
  7.         {cursor:pointer;position: absolute;}
  8.         #father
  9.         {border: 1px solid red;width: 50px;height: 10px;position: relative;}
  10.         #bar
  11.         {width: 211px;height: 18px;background-image: url("../image/track.gif");background-repeat: no-repeat;position: relative;}
  12.         .child
  13.         {width: 11px;height: 16px;background-image: url("../image/grip(11 16).gif");background-repeat: no-repeat;left: 0;top: 0;position: absolute;left: 100px;}
  14.         .smallbig{ cursor:pointer;}
  15.         li{ list-style:none;}

最后就是我们页面的jsp代码,这里我使用了struts2来ognl语言做输出

  1.     <link href="css/demo.css" rel="stylesheet" type="text/css" />
  2.     <script type="text/javascript" src="js/jquery.pack.js"></script>
  3.     <script src="js/ui.core.packed.js" type="text/javascript"></script>
  4.     <script src="js/ui.draggable.packed.js" type="text/javascript"></script>
  5.     <script type="text/javascript" src="js/demo.js"></script>
  6.   </head>
  7.   <body>
  8.  <s:form action="upload!change.action" namespace="/Upload" method="post">
  9.     <div id="Currentimages" style="overflow: auto;">
  10.         <ul>
  11.             <li>
  12.                 <div id="div_HeadImageCut">
  13.                     <h2> 裁切头像照片</h2><hr/>
  14.                     <div id="content">
  15.                         <div id="image">
  16.                             <img id="img" src='UploadImages/<s:property value="imageFileName"/>' />
  17.                         </div>
  18.                         <div id="drop">
  19.                             <img id="drop_img" src='UploadImages/<s:property value="imageFileName"/>' />
  20.                         </div>
  21.                     </div>
  22.                     <table>
  23.                         <tr>
  24.                             <td id="Min">
  25.                                     <img alt="缩小" src="image/Minc.gif" style="width: 19px; height: 19px"
  26.                                         id="moresmall" class="smallbig" />
  27.                             </td>
  28.                             <td>
  29.                                 <div id="bar">
  30.                                     <div class="child">
  31.                                     </div>
  32.                                 </div>
  33.                             </td>
  34.                             <td id="Max">
  35.                                     <img alt="放大" src="image/Maxc.gif" style="width: 19px; height: 19px"
  36.                                         id="morebig" class="smallbig" />
  37.                             </td>
  38.                         </tr>
  39.                     </table>
  40.                     <br />
  41.                     <input type="submit" id="btn_Image" value="保存头像"  /><br>
  42.                       原尺寸:宽<label id="width" class="Hidden">
  43.                     <s:property value="imageWidth"/></label>px  
  44.                     高:<label id="height" class="Hidden"><s:property value="imageHeight"/>px</label>
  45.                 </div>
  46.             </li>
  47.             <li>
  48.             图片实际宽度:
  49.              <s:textfield cssClass="Hidden" id="txt_width" name="txt_width"></s:textfield><br />
  50.             图片实际高度:
  51.              <s:textfield cssClass="Hidden" id="txt_height" name="txt_height"></s:textfield><br />
  52.             距离顶部:
  53.             <s:textfield cssClass="Hidden" id="txt_top" name="txt_top"></s:textfield><br />
  54.             距离左边:
  55.             <s:textfield cssClass="Hidden" id="txt_left" name="txt_left"></s:textfield><br />
  56.             截取框的宽:
  57.             <s:textfield cssClass="Hidden" id="txt_DropWidth" name="txt_DropWidth"></s:textfield><br />
  58.             截取框的高:
  59.             <s:textfield cssClass="Hidden" id="txt_DropHeight" name="txt_DropHeight"></s:textfield><br />
  60.             放大倍数:
  61.             <input cssClass="Hidden" id="txt_Zoom"  name="txt_Zoom" value="1"/><br />
  62.             
  63.           当前图片路径:<s:textfield name="imageUrl" id="imageUrl"></s:textfield><br>
  64.           
  65.           图片名称:<s:textfield name="imageFileName" id="imageFileName"></s:textfield>
  66.             </li>
  67.         </ul>
  68.     </div>
  69.     </s:form>
这样,我们客户端所需要的引入的脚本库,编写样式,拖拽、缩放的实现就完成了。剩下的就是在我们对客户端的图片做操作后将相关数据传送到服务器上。服务器根据数据对服务器上的图片进行缩放、剪裁了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值