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报错 Object doesn't support this property or method的原因分析
Mar 31 Javascript
IE与FireFox中的childNodes区别
Oct 20 Javascript
jquery分页插件jpaginate在IE中不兼容问题
Apr 22 Javascript
基于jQuery实现的文字按钮表单特效整理
Dec 07 Javascript
浅谈Javascript数组索引
Jul 29 Javascript
jQuery点击输入框显示验证码图片
May 19 Javascript
BootStrap的table表头固定tbody滚动的实例代码
Aug 24 Javascript
javascript表单控件实例讲解
Sep 13 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
Angular6新特性之Angular Material
Dec 28 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 Javascript
vue使用echarts画组织结构图
Feb 06 Vue.js
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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
php 生成饼图 三维饼图
2009/09/28 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python开发常用的一些开源Package分享
2015/02/14 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
COSETTE官网:奢华,每天
2020/03/22 全球购物
班组长安全生产职责
2013/12/16 职场文书
培训主管岗位职责
2014/02/01 职场文书
坎儿井导游词
2015/02/09 职场文书
幼师求职自荐信
2015/03/26 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB