客户端图片的相关参数的信息分为两个部分的获取的。
第一部分是获取原始图片的相关信息,来使图片显示正确
第二部分是通过js控制图片的缩放以及确认要剪辑图片的相关参数。以便将参数传送到服务器端。
这两个部分只是通过js控制图片的显示,预览最终要裁剪的效果,并没有对服务器上存储的图片进行任何的修改。
如图所示:
通过图形可以看到,我们这边的技术难点有两个,一个是缩放,另外一个是最终要剪裁的选择框。并且要将缩放的相关参数以及最终剪辑的相关数据提交到后台,我们的后台根据这些参数,对服务器上的图片进行处理。
图片的拖放、缩放、以及裁剪框的大小我们可以使用任何拥有这些功能的控件脚本。这里我使用的是jquery的1.2.6版本,以及他的ui组件。
具体引入如下:
- <script type="text/javascript" src="js/jquery.pack.js"></script>
- <script src="js/ui.core.packed.js" type="text/javascript"></script>
- <script src="js/ui.draggable.packed.js" type="text/javascript"></script>
jquery脚本只是基本的js控件库,详细的拖拽、拖放逻辑还是要我们自己编写,这里我编写到一个demo.js脚本中引入项目
- //获取图片大小的方法,在ie下偶尔有问题
- var getSizeImg = function(src)
- {
- var timg = $('<img>').attr('src', src).css({ position: 'absolute', top: '-1000px', left: '-1000px' }).appendTo('body');
- var size = [timg.get(0).offsetWidth, timg.get(0).offsetHeight];
- try { document.body.removeChild(timg[0]); }
- catch (e) { };
- return size;
- };
- //缩放代码
- function bigSmall()
- {
- var size=$(this).attr("id")=="morebig"?0.01:-0.01;
- var value=parseFloat($("#txt_Zoom").val());
- var temp=value+size;
- if(temp<=2)
- {
- $("#txt_Zoom").val((value+size).toString());
- var width=parseInt($("#width").text());
- var height=parseInt($("#height").text());
- $("#img").css({ width:parseInt(width*temp)+ "px", height:parseInt(height*temp) + "px" });
- $("#image").css({ width:parseInt((width*temp))+ "px", height:parseInt((height*temp)) + "px" });
- $("#drop_img").css({ width:parseInt((width*temp))+ "px", height:parseInt((height*temp)) + "px" });
- $("#txt_width").val($("#img").css("width").replace(/px/,""));
- $("#txt_height").val($("#img").css("height").replace(/px/,""));
- $(".child").css({left:parseInt($(".child").eq(0).css("left").replace(/px/,""))+size*100+"px"});
- }
- }
- //初始化
- $(document).ready(
- function()
- {
- var width = parseInt($("#width").text())//图片的原长宽
- var height = parseInt($("#height").text());
- //将图片长宽输入textbox中
- $("#txt_DropWidth").val($("#drop").css("width").replace("px",""));
- $("#txt_DropHeight").val($("#drop").css("height").replace("px", ""));
- $("#drop_img").css({left:"-101px",top:"-101px"});//将截取框内的图片移动到适合位置,注意截取框的1px边框
- //设置div的拖动功能
- $("#image").draggable({ cursor: 'move',
- drag: function(e, ui)
- {
- var self = $(this).data("draggable");
- var drop_img = $("#drop_img");
- var top = $("#drop_img").css("top").replace(/px/,"");//取出截取框到顶部的距离
- var left = $("#drop_img").css("left").replace(/px/,"");//取出截取框到左边的距离
- drop_img.css({left:(parseInt(self.position.left)-101)+"px",top:(parseInt(self.position.top)-101)+"px"});//同时移动内部的图片
- //drop_img.style.backgroundPosition = (self.position.left - parseInt(left)-1) + 'px ' + (self.position.top - parseInt(top)-1) + 'px';
- $("#txt_left").val(99-parseInt($(this).css("left")));
- $("#txt_top").val(99-parseInt($(this).css("top")));
- }
- });
- $("#drop_img").draggable(
- { cursor: 'move',
- drag: function(e, ui)
- {
- var self = $(this).data("draggable");
- var divimage=$("#image");
- //divimage.style.backgroundPosition = parseInt((self.position.left))*300 + 'px ' + parseInt((self.position.top))*300 + 'px';
- divimage.css({left:(parseInt(self.position.left)+101)+"px" ,top:(parseInt(self.position.top)+101)+"px"});//同时移动div
- $("#txt_left").val(99-parseInt($("#image").css("left")));
- $("#txt_top").val(99-parseInt($("#image").css("top")));
- }
- });
- $("#image").css({ opacity: 0.3,backgroundColor:"#fff",width: width + "px", height: height + "px" });
- $("#txt_top").val("100");
- $("#txt_left").val("100");
- $("#txt_width").val(width);
- $("#txt_height").val(height);
- $(".smallbig").click(bigSmall);
- //缩放的代码
- $(".child").draggable(
- {
- cursor:"move",containment:$("#bar"),
- drag:function(e,ui)
- {
- var left=parseInt($(this).css("left"));
- var value=1+(left-100)/100;
- $("#txt_Zoom").val(value);
- $("#img,image").css({ width:parseInt(width*value)+ "px", height:parseInt(height*value) + "px" });
- $("#image").css({ width:parseInt(width*value)+ "px", height:parseInt(height*value) + "px"});
- $("#drop_img").css({ width:parseInt(width*value)+ "px", height:parseInt(height*value) + "px"});
- $("#txt_width").val($("#img").css("width").replace(/px/,""));
- $("#txt_height").val($("#img").css("height").replace(/px/,""));
- }
- });
- }
- );
同时我将提供一个css文件demo.css来将我们页面的基础样式定义好
- html{filter: expression(document.execCommand("BackgroundImageCache", false, true));}
- body{ width:955px; text-align:left;}
- #content
- {cursor: pointer; position: relative;width: 320px;height: 320px; border: 1px solid #ccc;overflow: hidden;background-color:#bbb;}
- #drop{border: 1px solid #ccc;width: 120px;height: 160px;cursor: pointer;position: absolute;top: 100px; left: 100px;overflow: hidden;}
- #drop_img
- {cursor:pointer;position: absolute;}
- #father
- {border: 1px solid red;width: 50px;height: 10px;position: relative;}
- #bar
- {width: 211px;height: 18px;background-image: url("../image/track.gif");background-repeat: no-repeat;position: relative;}
- .child
- {width: 11px;height: 16px;background-image: url("../image/grip(11 16).gif");background-repeat: no-repeat;left: 0;top: 0;position: absolute;left: 100px;}
- .smallbig{ cursor:pointer;}
- li{ list-style:none;}
最后就是我们页面的jsp代码,这里我使用了struts2来ognl语言做输出
- <link href="css/demo.css" rel="stylesheet" type="text/css" />
- <script type="text/javascript" src="js/jquery.pack.js"></script>
- <script src="js/ui.core.packed.js" type="text/javascript"></script>
- <script src="js/ui.draggable.packed.js" type="text/javascript"></script>
- <script type="text/javascript" src="js/demo.js"></script>
- </head>
- <body>
- <s:form action="upload!change.action" namespace="/Upload" method="post">
- <div id="Currentimages" style="overflow: auto;">
- <ul>
- <li>
- <div id="div_HeadImageCut">
- <h2> 裁切头像照片</h2><hr/>
- <div id="content">
- <div id="image">
- <img id="img" src='UploadImages/<s:property value="imageFileName"/>' />
- </div>
- <div id="drop">
- <img id="drop_img" src='UploadImages/<s:property value="imageFileName"/>' />
- </div>
- </div>
- <table>
- <tr>
- <td id="Min">
- <img alt="缩小" src="image/Minc.gif" style="width: 19px; height: 19px"
- id="moresmall" class="smallbig" />
- </td>
- <td>
- <div id="bar">
- <div class="child">
- </div>
- </div>
- </td>
- <td id="Max">
- <img alt="放大" src="image/Maxc.gif" style="width: 19px; height: 19px"
- id="morebig" class="smallbig" />
- </td>
- </tr>
- </table>
- <br />
- <input type="submit" id="btn_Image" value="保存头像" /><br>
- 原尺寸:宽<label id="width" class="Hidden">
- <s:property value="imageWidth"/></label>px
- 高:<label id="height" class="Hidden"><s:property value="imageHeight"/>px</label>
- </div>
- </li>
- <li>
- 图片实际宽度:
- <s:textfield cssClass="Hidden" id="txt_width" name="txt_width"></s:textfield><br />
- 图片实际高度:
- <s:textfield cssClass="Hidden" id="txt_height" name="txt_height"></s:textfield><br />
- 距离顶部:
- <s:textfield cssClass="Hidden" id="txt_top" name="txt_top"></s:textfield><br />
- 距离左边:
- <s:textfield cssClass="Hidden" id="txt_left" name="txt_left"></s:textfield><br />
- 截取框的宽:
- <s:textfield cssClass="Hidden" id="txt_DropWidth" name="txt_DropWidth"></s:textfield><br />
- 截取框的高:
- <s:textfield cssClass="Hidden" id="txt_DropHeight" name="txt_DropHeight"></s:textfield><br />
- 放大倍数:
- <input cssClass="Hidden" id="txt_Zoom" name="txt_Zoom" value="1"/><br />
- 当前图片路径:<s:textfield name="imageUrl" id="imageUrl"></s:textfield><br>
- 图片名称:<s:textfield name="imageFileName" id="imageFileName"></s:textfield>
- </li>
- </ul>
- </div>
- </s:form>