jQuery Jcrop插件实现图片选取功能


Posted in Javascript onNovember 23, 2011

总的来说,原理很简单,大致流程是:在浏览器上加载原图 --> 用矩形框在原图上选取区域并将选取的顶点坐标和矩形尺寸发送至服务器 --> 服务器端用图片切割算法切割原图并输出切割后的图片。下面我们就分别对这几个步骤详细展开讨论分析,并在最后附上小demo供大家参考。

1、在页面上加载原图

这个就不用多说了,就是在页面上显示一张图片,一个img标签搞定,不过为了下一步演示,还是贴一下代码
<img src="girl.jpg" alt="" id="TestImage" style="float: left;">

2、用矩形框在原图上选取区域

这个我们要用到一个jQuery插件Jcrop,感谢Jcrop,其项目页面地址:http://deepliquid.com/content/Jcrop.html,再次感谢。接下来就是运用这个插件来让我们能在原图上随意地切图。先在页面上放几个隐藏域,用来存放当前选取的顶点坐标及选取矩形的尺寸,再放一个保存按钮,点击保存按钮后将在服务器上保存切割后的图片。代码如下:

<form id="AvatarForm" action=""> 
<input id="x" name="x" type="hidden"> 
<input id="y" name="y" type="hidden"> 
<input id="w" name="w" type="hidden"> 
<input id="h" name="h" type="hidden"> 
<input class="input_btn" id="BtnSaveAvatar" value="确定保存" type="submit"> 
</form>

四个隐藏域分别表示x:左上顶点x坐标;y:左上顶点y坐标;w:选取矩形宽度;h:选取矩形长度。
然后我们调用插件,做好初始化工作,引入js和css文件:
<script type="text/javascript" src="js/jquery.js"></script> 
<script type="text/javascript"src="js/Jcrop/js/jquery.Jcrop.js"></script> 
<link rel="stylesheet" href="js/Jcrop/css/jquery.Jcrop.css" type="text/css">

初始化原图的js代码:
$(document).ready(function(){ 
$('#TestImage').Jcrop({ 
onChange: updateCoords, 
onSelect: updateCoords 
}); 
$("#BtnSaveAvatar").click(function(){ 
$.ajax({ 
url:'Handler.ashx', 
data:{'x':$("#x").val(),'y':$("#y").val(),'w':$("#w").val(),'h':$("#h").val()}, 
datatype : "text/json", 
type:'post', 
success: function(o){ window.location.href="result.aspx?url="+o;} //成功后跳转到result页面查看切割后图片,把url 
}); 
return false; 
}); 
}); 
function updateCoords(c){ 
$('#x').val(c.x); 
$('#y').val(c.y); 
$('#w').val(c.w); 
$('#h').val(c.h); 
};

经过上述步骤,我们很高兴的看到一位美女出现在我们眼前,并任由我们选取任何部位,很刺激吧,由于demo在最后,先在这截一张效果图吧

jQuery Jcrop插件实现图片选取功能
3、服务器端切割图片并输出切割后的图片:
切割图片的主要类代码如下:

public class ImageCut 
{ 
///<summary> 
/// 剪裁 -- 用GDI+ 
///</summary> 
///<param name="b">原始Bitmap</param> 
///<param name="StartX">开始坐标X</param> 
///<param name="StartY">开始坐标Y</param> 
///<param name="iWidth">宽度</param> 
///<param name="iHeight">高度</param> 
///<returns>剪裁后的Bitmap</returns> 
public Bitmap KiCut(Bitmap b) 
{ 
if (b == null) 
{ 
return null; 
} int w = b.Width; 
int h = b.Height; 
if (X >= w || Y >= h) 
{ 
return null; 
} 
if (X + Width > w) 
{ 
Width = w - X; 
} 
if (Y + Height > h) 
{ 
Height = h - Y; 
} 
try 
{ 
Bitmap bmpOut = new Bitmap(Width, Height, PixelFormat.Format24bppRgb); 
Graphics g = Graphics.FromImage(bmpOut); 
g.DrawImage(b, new Rectangle(0, 0, Width, Height), new Rectangle(X, Y, Width, Height), GraphicsUnit.Pixel); 
g.Dispose(); 
return bmpOut; 
} 
catch 
{ 
return null; 
} 
} 
public int X = 0; 
public int Y = 0; 
public int Width = 120; 
public int Height = 120; 
public ImageCut(int x, int y, int width, int heigth) 
{ 
X = x; 
Y = y; 
Width = width; 
Height = heigth; 
} 
}

在Handler.ashx中,接收页面传递过来的切割图片的顶点坐标以及长宽尺寸,并调用C#图像切割类实现图片切割:
public void ProcessRequest (HttpContext context) { 
string xstr = context.Request["x"]; 
string ystr = context.Request["y"]; 
string wstr = context.Request["w"]; 
string hstr = context.Request["h"]; 
string sourceFile = context.Server.MapPath("girl.jpg"); 
string savePath = "CutImage/" + Guid.NewGuid() + ".jpg"; 
int x = 0; 
int y = 0; 
int w = 1; 
int h = 1; 
try 
{ 
x = int.Parse(xstr); 
y = int.Parse(ystr); 
w = int.Parse(wstr); 
h = int.Parse(hstr); 
} 
catch { } ImageCut ic = new ImageCut(x, y, w, h); 
System.Drawing.Bitmap cuted = ic.KiCut(new System.Drawing.Bitmap(sourceFile)); 
string cutPath = context.Server.MapPath(savePath); 
cuted.Save(cutPath, System.Drawing.Imaging.ImageFormat.Jpeg); 
context.Response.Write(savePath); //输出保存的路径,以便页面端接收路径显示切割后的图片 
}

最后我们在Result.aspx页面上接收切割后的图片路径并显示切割后的图片:

<img src="<%=Request["url"] %>" alt="" />
好了,整个过程就完成了,为了大家能更好的参考学习,下面附上小demo,下载demo。

最后,你是否带走了我留下的这片云彩?请告诉我,我很期待你的答案。

Javascript 相关文章推荐
js判读浏览器是否支持html5的canvas的代码
Nov 18 Javascript
浅谈Javascript 执行顺序
Dec 18 Javascript
javascript中数组中求最大值示例代码
Dec 18 Javascript
javascript背景时钟实现方法
Jun 18 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
JS设置cookie、读取cookie
Feb 24 Javascript
AngularJS开发教程之控制器之间的通信方法分析
Dec 25 Javascript
Node接收电子邮件的实例代码
Jul 21 Javascript
Vue的Flux框架之Vuex状态管理器
Jul 30 Javascript
JS中offset和匀速动画详解
Feb 06 Javascript
vue两个组件间值的传递或修改方式
Jul 04 Javascript
jQuery实现视频展示效果
May 30 jQuery
JQUERY1.6 使用方法四 检测浏览器
Nov 23 #Javascript
JQuery1.6 使用方法三
Nov 23 #Javascript
jQuery1.6 使用方法二
Nov 23 #Javascript
jQuery1.6 使用方法一
Nov 23 #Javascript
JS 表单验证大全
Nov 23 #Javascript
JavaScript中的16进制字符(改进)
Nov 21 #Javascript
日期处理的js库(迷你版)--自建js库总结
Nov 21 #Javascript
You might like
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
php入门小知识
2008/03/24 PHP
php GeoIP的使用教程
2011/03/09 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
vue项目中使用Svg的方法
2018/10/24 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
详细介绍Python中的偏函数
2015/04/27 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python批量爬取下载抖音视频
2019/06/17 Python
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
经典c++面试题四
2015/05/14 面试题
英语翻译系毕业生求职信
2013/09/29 职场文书
安全生产汇报材料
2014/02/17 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
公休请假条
2014/04/11 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
人事局接收函
2015/01/30 职场文书
浅谈pytorch中的dropout的概率p
2021/05/27 Python