imgAreaSelect 是由 Michal Wojciechowski开发的一款非常好用的jquery插件,实现了图片的截取功能。其文档和Demo也是很详尽的。大家可以到http://odyniec.net/projects/imgareaselect/了解更多的细节。

下面我们就开始使用imgAreaSelect 开始code吧。

第一还是要引用jquery,接着引用下载好的 jquery.imgareaselect.pack.js 文件和 imgareaselect-default.css 样式文件。

接着写一些元素标签

<img id="ferret" src="" alt="It's coming right for us!" title="It's coming right for us!"
style="float: left; margin-right: 10px; width: 400px; height: 300px" /> <input type="hidden" name="x1" value="" />
<input type="hidden" name="y1" value="" />
<input type="hidden" name="x2" value="" />
<input type="hidden" name="y2" value="" />
<input id="loadFile" type="file" name="name" onchange="readURL(this);" />
<input type="submit" name="submit" value="Submit" />

  

这将用来展示图片和记录截取图片的坐标点。

接着开始写js

<script type="text/javascript">
//绘制小图
function preview(img, selection) {
var scaleX = 100 / (selection.width || 1);
var scaleY = 100 / (selection.height || 1); $('#ferret + div > img').css({
width: Math.round(scaleX * 400) + 'px',
height: Math.round(scaleY * 300) + 'px',
marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px',
marginTop: '-' + Math.round(scaleY * selection.y1) + 'px'
});
} $(document).ready(function () {
//添加小图
$('<div><img id="ferret1" src="" style="position: relative;" /><div>')
.css({
float: 'left',
position: 'relative',
overflow: 'hidden',
width: '100px',
height: '100px'
})
.insertAfter($('#ferret'));
//主图编辑
$('#ferret').imgAreaSelect({ x1: 120, y1: 90, x2: 280, y2: 210, aspectRatio: '4:3', onSelectChange: preview, onSelectEnd: function (img, selection) {
$('input[name="x1"]').val(selection.x1);
$('input[name="y1"]').val(selection.y1);
$('input[name="x2"]').val(selection.x2);
$('input[name="y2"]').val(selection.y2);
}
});
}); //本地预览
function readURL(input) {
var strSrc = $("#loadFile").val(); //验证上传文件格式是否正确
var pos = strSrc.lastIndexOf(".");
var lastname = strSrc.substring(pos, strSrc.length);
if (lastname.toLowerCase() != ".jpg") {
alert("您上传的文件类型为" + lastname + ",图片必须为 JPG 类型");
return false;
} //验证上传文件是否超出了大小
if (input.files[0].size / 1024 > 150) {
alert("您上传的文件大小超出了150K限制!");
return false;
} if (input.files && input.files[0]) {
var reader = new FileReader(); reader.onload = function (e) {
$('#ferret').attr('src', e.target.result);
$('#ferret1').attr('src', e.target.result);
}; reader.readAsDataURL(input.files[0]);
}
}
</script>

  

上述js完成了本地预览(此处的预览在chrome中正常;在IE中有些问题暂时没有找到本地预览的方法,大家可以用远程方式替换)和截取图片的功能。

前端写完了,接下来开始写后端的代码了

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
int x1 = Convert.ToInt32(Request["x1"]);
int y1 = Convert.ToInt32(Request["y1"]);
int x2 = Convert.ToInt32(Request["x2"]);
int y2 = Convert.ToInt32(Request["y2"]); HttpFileCollection files = Request.Files;
for (int i = 0; i < files.Count; i++)
{
HttpPostedFile file = files[i];
file.SaveAs(Server.MapPath("Upload/" + file.FileName)); //设置缩略图
int Thumbnailwidth = 400;
int Thumbnailheight = 300;
//新建一个bmp图片
Bitmap bitmap = new Bitmap(Thumbnailwidth, Thumbnailheight); //新建一个画板
Graphics graphic = Graphics.FromImage(bitmap); //设置高质量插值法
graphic.InterpolationMode = InterpolationMode.High; //设置高质量,低速度呈现平滑程度
graphic.SmoothingMode = SmoothingMode.HighQuality; //清空画布并以透明背景色填充
graphic.Clear(System.Drawing.Color.Transparent); //原图片
Bitmap originalImage = new Bitmap(file.InputStream); //在指定位置并且按指定大小绘制原图片的指定部分
graphic.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, Thumbnailwidth, Thumbnailheight),
new System.Drawing.Rectangle(0, 0, originalImage.Width, originalImage.Height),
System.Drawing.GraphicsUnit.Pixel); //得到缩略图
System.Drawing.Image ThumbnailImage = System.Drawing.Image.FromHbitmap(bitmap.GetHbitmap()); //创建选择图片
Bitmap selectbitmap = new Bitmap(x2-x1, y2-y1); //新建一个画板
Graphics selectgraphic = Graphics.FromImage(selectbitmap); //裁切
selectgraphic.DrawImage(ThumbnailImage, 0, 0, new Rectangle(x1, y1, x2 - x1, y2 - y1), GraphicsUnit.Pixel); //保存
selectbitmap.Save(Server.MapPath("Upload/"+Guid.NewGuid() + file.FileName), ImageFormat.Jpeg); //todo:将上述资源释放 }
}
}

  这里我们先将图片缩小到与前台大图一样的比例,然后在进行截取,并保存到文件中。

网站中集成jquery.imgareaselect实现图片的本地预览和选择截取的更多相关文章

  1. 搞清Image加载事件(onload)、加载状态(complete)后,实现图片的本地预览,并自适应于父元素内(完成)

    onload与complete介绍 complete只是HTMLImageElement对象的一个属性,可以判断图片加载完成,不管图片是不是有缓存:而onload则是这个Image对象的load事件回 ...

  2. jQuery + ashx 实现图片按比例预览、异步上传及显示

    目录(?)[-] 注ajax 方式异步读取数据库显示图片的方法同上传一致使用 ashx 返回base64字符串在客户端处理即可 记录一个让我纠结良久的问题 在Page_Load 函数中只有第一个用 S ...

  3. HTML+Jquery实现多图片上传预览功能

    HTML:使用input的onchange事件,它一改变就触发事件 <p id="p3"> <input name="File" onchan ...

  4. 使用ajax,结合jquery,php实现图片上传预览功能

    大致逻辑:点击页面的file,上传图片到指定的php处理图片的文件,处理完成以后,将图片的连接地址返回,JS控制返回的数据,然后将图片动态的展示出来html代码<label> <im ...

  5. 图片本地预览 flash html5

    dataURI 一种能够在页面嵌入外部资源的URI方案.能够降低图片或者样式表的http请求数量,提高效率. ie8把dataURI 的属性值限制在32k以内. 图片本地预览: 由于安全原因,通过fi ...

  6. [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)

    目录 1.   介绍 2.   软件环境 3.   在运行示例代码之前(源代码 + 示例登陆帐号) 4.         jqGrid和AJAX 5.         GridSettings 6.  ...

  7. jquery 图片上传本地预览V1.2

    基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 代码进行小小的压缩 如果看源码 自己解压就行了 版本已升级  修复jquery版本问题  支持任意jqu ...

  8. jQuery图片上传前先在本地预览(不经过后端处理)

    前段时间遇到一个问题,前端想实现图片上传预览(不经过后端PHP或JAVA处理),用户点击file按钮上传文件,点击确定马上就能看到预览的效果,但在实现的时候无论怎样都取不到file上图片的真实路径,得 ...

  9. JQuery插件:图片上传本地预览插件,改进案例一则。

    /* *名称:图片上传本地预览插件 v1.1 *作者:周祥 *时间:2013年11月26日 *介绍:基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari *插 ...

随机推荐

  1. 当target属性在XHTML script中无效时

    <a href="#" target=_blank></a>target此属性能够使链接在新窗口打开,但是在XHTML script中无效时. 那么解决方案 ...

  2. LabVIEW如何将脚本插入Quick Drop

    问题:如何将自己设计的LabVIEW脚本做成快捷键的方式,实现效果如下 解决: 第一步:在LabVIEW Data中新建Quick Drop Plugins 第二步 在文件夹下新建一个VI,VI接口的 ...

  3. HTML5 Input 类型

    浏览器支持 Input type IE Firefox Opera Chrome Safari email No 4.0 9.0 10.0 No url No 4.0 9.0 10.0 No numb ...

  4. BizTalk开发系列(三十五) TCP/IP 适配器

    BizTalk 的TCP/IP适配器最初是为英国的保健行业开发.该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯. TCP/IP适 ...

  5. ThinkPHP3.2.3 Nginx 下 URL_MODEL 的配置

    ThinkPHP3.2.3 的 URL_MODEL 包括普通模式(0).PATHINFO 模式(1).REWRITE 模式(2).兼容模式(3)等 4 种 URL 模式.在 Apache 下只要在配置 ...

  6. Dynamic Percentage of Operands

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION

  7. mysql root 维护

    修改root密码: mysql -uroot -paaamysql> use mysql;mysql> UPDATE user SET password=password("aa ...

  8. Hadoop离线项目介绍(不包括程序)

    一:项目场景 1.需求分析 根据用户行为数据进行程序的处理,得到结果保存到关系型数据库中 需要收集用户(系统使用者)在不同客户端上产生的用户行为数据,最终保存到hdfs上 需要明确收集字段的相关信息, ...

  9. 基于XMPP协议(openfire服务器)的消息推送实现

    转自:http://blog.csdn.net/nomousewch/article/details/8088277 最近好像有不少朋友关注Android客户端消息推送的实现,我在之前的项目中用到过J ...

  10. C++程序设计(一)

    1. 函数指针 程序运行期间,每个函数都会占用一段连续的内存空间.而函数名就是该函数所占内存区域的起始地址(也称"入口地址").我们可以将函数的入口地址赋给一个指针变量,使该指针变 ...