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. SQL 联合索引 与 单一列的索引 比较

    背景: 公司业务迅速扩展,很多网站.接口都因为大流量的数据,发生服务器习惯性死机:一条sql查询语句只能适用于一定的网络环境,没有优化的查询当遇上大数据时就不适用了. 本文主旨: 讨论什么情况下能利用 ...

  2. 简单实现异步编程promise模式

    本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多 ...

  3. 分模块创建maven项目(一)

    maven是一个项目构建和管理的工具. 我们可以通过maven仓库可以实现管理构建(主要是JAR还包括:WAR,ZIP,POM等等). 我们可以通过maven插件可以实现编译源代.产生Javadoc文 ...

  4. python 获取进程pid号

    #-*- encoding:UTF-8 -*- import os import sys import string import psutil import re def get_pid(name) ...

  5. 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 ...

  6. childNodes 和children

    childNodes 兼容性不是很好,一般用children 元素.childNodes : 只读 属性 子节点列表集合标准下:包含了空白换行和元素类型的节点,也会包含非法嵌套的子节点非标准下:只包含 ...

  7. bootstrap使用性能问题

    1.如icheckbox等的初始化,不要采用类似for in的循环来对所需应用的元素进行初始化,直接采用如  $('[data-toggle="popover"]').popove ...

  8. servlet的生命周期与运行时的线程模型

    第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过 ...

  9. MySQL Server-id踩到的坑

    最近踩到一个说大不大,说小不小的坑,在此分享出来给各位同学.事情是这样的,线上有2台服务器,1主1从.A -> B,B服务器从A服务器同步数据.每天使用xtrabackup在B服务器上面进行全备 ...

  10. 2145334赵文豪《Java程序设计》第2周学习总结

    2145334赵文豪<Java程序设计>第2周学习总结 教材学习内容总结 第二周的学习结束了,又是充实的一周,在这周的java学习过程中,我们主要学习了java的基础语法.其中包括类型变量 ...