图片剪切之Croppic插件
前几天做图片上传时需要进行图片的剪切和缩放,上网查找时找到了这个插件。样式很好看,功能也很OK。但是网上都是php进行后台处理图片的例子,然后只好慢慢琢磨C#的处理。插件地址是:http://www.croppic.net/;
首先下载好插件,放入程序文件中。新建页面,引入croppic.js,croppic.min.js,croppic.css文件,同时不要忘记引入jquery文件,我用的是1.8.2的版本。之前没引入1.8.2的版本,而是使用的下载下来的demo中的https://code.jquery.com/jquery-1.10.2.min.js这个版本,不知道是不是1.10.2版本的问题,点击上传按钮没有反应,打开F12总是提示我找不到$,也就是没有jquery的错误,后来引入了jquery-1.8.2.min.js文件以后果然可以使用了。
一、页面
页面代码没什么好说的,demo里都有,不过还是贴一下javascript的部分吧。
<script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
<script>
var croppicHeaderOptions = {
uploadUrl: "Ashx/Upload.ashx",
cropData: {
"DummyData": ,
"DummyData2":"asdas"
},
cropUrl:"Ashx/Cropper.ashx",
customUploadButtonId: "cropContainerHeaderButton",
model: false,
loaderHtml: '<div class="loader bubblingG"><span id="bubblingG_1"></span><span id="bubblingG_2"></span><span id="bubblingG_3"></span></div> '
}
var croppic = new Croppic("croppic", croppicHeaderOptions); var cropContainerModalOptions = {
uploadUrl: "Ashx/Upload.ashx",
cropUrl: "Ashx/Cropper.ashx",
model: true,
imgEyecandyOpacity: 0.4,
loaderHtml: '<div class="loader bubblingG"><span id="bubblingG_1"></span><span id="bubblingG_2"></span><span id="bubblingG_3"></span></div> '
}
var cropContainerModal = new Croppic("cropContainerModal", cropContainerModalOptions);
</script>
这其中uploadUrl和cropUrl对应的ashx文件分别是我处理上传图片和剪切图片的后台程序,其他的部分照抄demo里的。
二、上传图片
上传图片的处理程序网上也是一找一大堆的,不过在这个插件里面要注意:根据官方文档,处理以后返回的json代码是固定的,例如处理成功时需返回4个参数,分别是status,url,width和height;而失败时则只需要返回两个参数,分别是status和message。我在后台使用了JavaScriptSerializer进行了json的序列化处理,不用费心费力再去写json语句。以下代码段是上传图片成功时系统应返回的json,当然失败时也类似,这里就不举例了:
{
"status":"success",
"url":"path/img.jpg",
"width":originalImgWidth,
"height":originalImgHeight
}
我的upload.ashx文件:
try
{
HttpPostedFile file = context.Request.Files["img"];
string uploadPath = "/images/croppers/";
if (file != null)
{
var server = HttpContext.Current.Server;
string destdir = server.MapPath(uploadPath); if (!System.IO.Directory.Exists(destdir))
System.IO.Directory.CreateDirectory(destdir);//如果文件夹不存在就创建它 string fname = file.FileName;
string _file_ext = Path.GetExtension(fname);
string dataname = DateTime.Now.ToFileTime().ToString();
string filename = destdir + dataname + _file_ext;//随机名
file.SaveAs(filename); System.Drawing.Image image = System.Drawing.Image.FromFile(filename);
MODEL.AjaxMsg m = new MODEL.AjaxMsg();
m.status = "success";
m.url = uploadPath + dataname + _file_ext;
m.width = image.Width;
m.height = image.Height;
JavaScriptSerializer js = new JavaScriptSerializer();
context.Response.Write(js.Serialize(m));
}
else
{
MODEL.AjaxMsg m = new MODEL.AjaxMsg();
m.status = "error";
m.message = "文件没找到";
JavaScriptSerializer js = new JavaScriptSerializer();
context.Response.Write(js.Serialize(m));
}
}
catch
{
MODEL.AjaxMsg m = new MODEL.AjaxMsg();
m.status = "error";
m.message = "服务器错误";
JavaScriptSerializer js = new JavaScriptSerializer();
context.Response.Write(js.Serialize(m));
}
三、图片剪切
在图片剪切之前,我先对图片进行了缩放处理。开始我也是按照原图的尺寸来剪切图片的,剪切的大小在页面文件里面定好,也就是图片框的大小。但是我发现一旦上传大一点的图片时,croppic插件在显示时会将图片设置成它默认的大小,其后可以根据放大缩小按钮来对图片进行操作,只是此时一旦剪切图片时,剪切的图片并不是我们所见的图片,因为实际图片并没有进行缩放,而只是在显示时进行了假装的缩放。好在插件在剪切时会有imgW和imgH参数传递过来,告诉开发者该图片现在缩放的长宽属性,根据此长宽属性进行缩放以后,我们便可以将我们的原图也进行缩放便于截取图片。
context.Response.ContentType = "text/plain";
string imgurl = context.Request["imgUrl"];
int imgInitW = int.Parse(context.Request["imgInitW"].ToString());//原图宽
int imgInitH = int.Parse(context.Request["imgInitH"].ToString());//原图长
//缩放后图片长宽
int imgW = int.Parse( context.Request["imgW"].ToString());
double HH = Convert.ToDouble(context.Request["imgH"].ToString());//可能在缩放时出现小数点
int imgH = (int)HH; int imgY1 = int.Parse( context.Request["imgY1"].ToString());//剪切点起始坐标Y
int imgX1 = int.Parse( context.Request["imgX1"].ToString());//剪切点起始坐标X
int cropW = int.Parse( context.Request["cropW"].ToString());//剪切宽度
int cropH = int.Parse( context.Request["cropH"].ToString());//剪切长度 string cropPath = "/images/croppers/";
var server = HttpContext.Current.Server;
string destdir = server.MapPath(cropPath);
if (!System.IO.Directory.Exists(destdir))
System.IO.Directory.CreateDirectory(destdir);
string name = imgurl.Substring(imgurl.LastIndexOf('/'));
name = name.Split('/').GetValue(1).ToString();
string filename = cropPath + "crops_Thumb_" + name; string imgurl_t = cropPath + "Thumb_" + name;
App_Code.ImageHelp imgHelp = new App_Code.ImageHelp();
imgHelp.MakeThumNail(imgurl, imgurl_t, imgW, imgH, "W");
imgHelp.GetPart(imgurl_t, cropPath, 0, 0, cropW, cropH, imgX1, imgY1); MODEL.AjaxMsg m = new MODEL.AjaxMsg();
m.status = "success";
m.url = filename;
JavaScriptSerializer js = new JavaScriptSerializer();
context.Response.Write(js.Serialize(m));
其中imgHelp.MakeThumNail()方法是对原图进行缩放,我在这边使用按宽度进行缩放,因为croppic插件也是按照宽度进行缩放的,所以与他一直就好。imgHelp.GetPart()方法则是对图片进行截取。在写这些方法的时候要注意,截取完或者缩放完保存图片时一定要是硬盘的具体路径,比如D://img这样的路径,因为这个错误我之前卡住了好久的。当然,插件也规定了截取图片成功以后返回的参数status和url,这里url不能为硬盘地址了哟,而要使用相对地址,因为这是用来显示到页面的。
四、总结
该插件一旦掌握了以后就不难的。只是目前刚刚学习的版本中,会出现3张图片:原图、缩略图、截取后图片。深入研究以后可以考虑将原图、缩略图删除,只留截取后的图片,这样对服务器负担不会那么大。下一步想尝试一下是不是可以用在手机里,尤其是微信浏览器中,很多都不支持插件。我之前写到微信浏览器中的图片上传还是使用的是input file这种html的原生控件,饶是如此,还是有某些手机不支持微信内部上传。至于uploadify插件更是不可用。
图片剪切之Croppic插件的更多相关文章
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明
php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切.压缩.合并.插入文本.背景色透明等.并且有api方法调用和命令行操作两种方式,如果只是简单处理的话建议api方法 ...
- javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...
- javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)
在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...
- javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)
类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...
- 图片懒加载插件lazyload使用方法
图片懒加载插件lazyload使用方法 一.如何使用: Lazy Load 依赖于 jQuery.引入文件 <script type="text/javascript" sr ...
- iOS开发UI篇—Quartz2D使用(图片剪切)
iOS开发UI篇—Quartz2D使用(图片剪切) 一.使用Quartz2D完成图片剪切 1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: - ...
- 【iOS】Quartz2D图片剪切
一.使用Quartz2D完成图片剪切1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: - (void)drawRect:(CGRect)rec ...
- 图片上传,图片剪切jquery.imgareaselect
---恢复内容开始--- <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 图片剪裁上传插件 - cropper
图片剪裁上传插件 - cropper <style> .photo-container{float: left;width: 300px;height: 300px;} .photo-co ...
随机推荐
- 美国TJX公司 - MBA智库百科
美国TJX公司 - MBA智库百科 TJX公司总部设在美国波士顿,在北美地区和许多欧洲国家开有连锁分店,仅在美国就有2500多家分店. TJX Companies, Inc. 是美国和全世界的服装和家 ...
- rsyslog 配置
在Debian环境下: 1,配置文件在/etc/rsyslogd.conf下: 2,如果要增加配置,并且不想直接修改rsyslogd.conf文件,可以在/etc/rsyslog.d/目录下增加文件, ...
- C# OR/Mapping 数据处理模式学习
为什么要提出O/R Mapping概念 程序语言已经由面向过程的模型全面转向为面向对象的模型,UML的出现更加革新了软件开发方法论.然而数据库模型却从未随着开发语言的进步而随之革新,仍然使用面向关系的 ...
- SQL学习之汇总数据之聚集函数
一. 1.我们经常需要汇总数据而不用把他们实际检索出来,为此SQL提供了专门的函数,以便于分析数据和报表生成,这些函数的功能有: (1)确定表中行数(或者满足单个条件或多个条件或包含某个特定值的行数) ...
- Ueditor和CKeditor 两款编辑器的使用与配置
一丶ueditor 百度编辑器 1.官方文档,演示,下载地址:http://ueditor.baidu.com/website/index.html 2.百度编辑器的好:Editor是由百度web前端 ...
- Android程序捕获未处理异常,处理与第三方方法冲突时的异常传递
自己的android程序对异常进行了处理,用的也是网上比较流行的CrashHandler,代码如下,就是出现了未处理的异常程序退出,并收集收集设备信息和错误信息仪器保存到SD卡,这里没有上传到服务器. ...
- js 中的闭包
/** *闭包就是在一个函数的外面访问函数内部的变量 **/ var name = "xiao A"; var obj = { name : "xiao B" ...
- Oracle Select into 用Sql server替换
--Oracle: DECLARE n_count int; begin Select count(*) into n_count from from M_Test where ENTITYLSH = ...
- 浅谈SpringMVC(一)
一.SpringMVC引言 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MV ...
- 使用mobile jQuery 动态给select下拉添加数据,选中项默认不显示的解决方法。
getaddress(); function getaddress(type=0,parent='') { var tid=1; $.ajax({ type: "post", ur ...