前几天做图片上传时需要进行图片的剪切和缩放,上网查找时找到了这个插件。样式很好看,功能也很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的部分吧。

  1. <script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
  2. <script>
  3. var croppicHeaderOptions = {
  4. uploadUrl: "Ashx/Upload.ashx",
  5. cropData: {
  6. "DummyData": ,
  7. "DummyData2":"asdas"
  8. },
  9. cropUrl:"Ashx/Cropper.ashx",
  10. customUploadButtonId: "cropContainerHeaderButton",
  11. model: false,
  12. loaderHtml: '<div class="loader bubblingG"><span id="bubblingG_1"></span><span id="bubblingG_2"></span><span id="bubblingG_3"></span></div> '
  13. }
  14. var croppic = new Croppic("croppic", croppicHeaderOptions);
  15.  
  16. var cropContainerModalOptions = {
  17. uploadUrl: "Ashx/Upload.ashx",
  18. cropUrl: "Ashx/Cropper.ashx",
  19. model: true,
  20. imgEyecandyOpacity: 0.4,
  21. loaderHtml: '<div class="loader bubblingG"><span id="bubblingG_1"></span><span id="bubblingG_2"></span><span id="bubblingG_3"></span></div> '
  22. }
  23. var cropContainerModal = new Croppic("cropContainerModal", cropContainerModalOptions);
  24. </script>

这其中uploadUrl和cropUrl对应的ashx文件分别是我处理上传图片和剪切图片的后台程序,其他的部分照抄demo里的。

二、上传图片

        上传图片的处理程序网上也是一找一大堆的,不过在这个插件里面要注意:根据官方文档,处理以后返回的json代码是固定的,例如处理成功时需返回4个参数,分别是status,url,width和height;而失败时则只需要返回两个参数,分别是status和message。我在后台使用了JavaScriptSerializer进行了json的序列化处理,不用费心费力再去写json语句。以下代码段是上传图片成功时系统应返回的json,当然失败时也类似,这里就不举例了:

  1. {
  2. "status":"success",
  3. "url":"path/img.jpg",
  4. "width":originalImgWidth,
  5. "height":originalImgHeight
  6. }

  我的upload.ashx文件:

  1. try
  2. {
  3. HttpPostedFile file = context.Request.Files["img"];
  4. string uploadPath = "/images/croppers/";
  5. if (file != null)
  6. {
  7. var server = HttpContext.Current.Server;
  8. string destdir = server.MapPath(uploadPath);
  9.  
  10. if (!System.IO.Directory.Exists(destdir))
  11. System.IO.Directory.CreateDirectory(destdir);//如果文件夹不存在就创建它
  12.  
  13. string fname = file.FileName;
  14. string _file_ext = Path.GetExtension(fname);
  15. string dataname = DateTime.Now.ToFileTime().ToString();
  16. string filename = destdir + dataname + _file_ext;//随机名
  17. file.SaveAs(filename);
  18.  
  19. System.Drawing.Image image = System.Drawing.Image.FromFile(filename);
  20. MODEL.AjaxMsg m = new MODEL.AjaxMsg();
  21. m.status = "success";
  22. m.url = uploadPath + dataname + _file_ext;
  23. m.width = image.Width;
  24. m.height = image.Height;
  25. JavaScriptSerializer js = new JavaScriptSerializer();
  26. context.Response.Write(js.Serialize(m));
  27. }
  28. else
  29. {
  30. MODEL.AjaxMsg m = new MODEL.AjaxMsg();
  31. m.status = "error";
  32. m.message = "文件没找到";
  33. JavaScriptSerializer js = new JavaScriptSerializer();
  34. context.Response.Write(js.Serialize(m));
  35. }
  36. }
  37. catch
  38. {
  39. MODEL.AjaxMsg m = new MODEL.AjaxMsg();
  40. m.status = "error";
  41. m.message = "服务器错误";
  42. JavaScriptSerializer js = new JavaScriptSerializer();
  43. context.Response.Write(js.Serialize(m));
  44. }

三、图片剪切

在图片剪切之前,我先对图片进行了缩放处理。开始我也是按照原图的尺寸来剪切图片的,剪切的大小在页面文件里面定好,也就是图片框的大小。但是我发现一旦上传大一点的图片时,croppic插件在显示时会将图片设置成它默认的大小,其后可以根据放大缩小按钮来对图片进行操作,只是此时一旦剪切图片时,剪切的图片并不是我们所见的图片,因为实际图片并没有进行缩放,而只是在显示时进行了假装的缩放。好在插件在剪切时会有imgW和imgH参数传递过来,告诉开发者该图片现在缩放的长宽属性,根据此长宽属性进行缩放以后,我们便可以将我们的原图也进行缩放便于截取图片。

  1. context.Response.ContentType = "text/plain";
  2. string imgurl = context.Request["imgUrl"];
  3. int imgInitW = int.Parse(context.Request["imgInitW"].ToString());//原图宽
  4. int imgInitH = int.Parse(context.Request["imgInitH"].ToString());//原图长
  5. //缩放后图片长宽
  6. int imgW = int.Parse( context.Request["imgW"].ToString());
  7. double HH = Convert.ToDouble(context.Request["imgH"].ToString());//可能在缩放时出现小数点
  8. int imgH = (int)HH;
  9.  
  10. int imgY1 = int.Parse( context.Request["imgY1"].ToString());//剪切点起始坐标Y
  11. int imgX1 = int.Parse( context.Request["imgX1"].ToString());//剪切点起始坐标X
  12. int cropW = int.Parse( context.Request["cropW"].ToString());//剪切宽度
  13. int cropH = int.Parse( context.Request["cropH"].ToString());//剪切长度
  14.  
  15. string cropPath = "/images/croppers/";
  16. var server = HttpContext.Current.Server;
  17. string destdir = server.MapPath(cropPath);
  18. if (!System.IO.Directory.Exists(destdir))
  19. System.IO.Directory.CreateDirectory(destdir);
  20. string name = imgurl.Substring(imgurl.LastIndexOf('/'));
  21. name = name.Split('/').GetValue(1).ToString();
  22. string filename = cropPath + "crops_Thumb_" + name;
  23.  
  24. string imgurl_t = cropPath + "Thumb_" + name;
  25. App_Code.ImageHelp imgHelp = new App_Code.ImageHelp();
  26. imgHelp.MakeThumNail(imgurl, imgurl_t, imgW, imgH, "W");
  27. imgHelp.GetPart(imgurl_t, cropPath, 0, 0, cropW, cropH, imgX1, imgY1);
  28.  
  29. MODEL.AjaxMsg m = new MODEL.AjaxMsg();
  30. m.status = "success";
  31. m.url = filename;
  32. JavaScriptSerializer js = new JavaScriptSerializer();
  33. context.Response.Write(js.Serialize(m));

  其中imgHelp.MakeThumNail()方法是对原图进行缩放,我在这边使用按宽度进行缩放,因为croppic插件也是按照宽度进行缩放的,所以与他一直就好。imgHelp.GetPart()方法则是对图片进行截取。在写这些方法的时候要注意,截取完或者缩放完保存图片时一定要是硬盘的具体路径,比如D://img这样的路径,因为这个错误我之前卡住了好久的。当然,插件也规定了截取图片成功以后返回的参数status和url,这里url不能为硬盘地址了哟,而要使用相对地址,因为这是用来显示到页面的。

四、总结

该插件一旦掌握了以后就不难的。只是目前刚刚学习的版本中,会出现3张图片:原图、缩略图、截取后图片。深入研究以后可以考虑将原图、缩略图删除,只留截取后的图片,这样对服务器负担不会那么大。下一步想尝试一下是不是可以用在手机里,尤其是微信浏览器中,很多都不支持插件。我之前写到微信浏览器中的图片上传还是使用的是input file这种html的原生控件,饶是如此,还是有某些手机不支持微信内部上传。至于uploadify插件更是不可用。

图片剪切之Croppic插件的更多相关文章

  1. php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明

    php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切.压缩.合并.插入文本.背景色透明等.并且有api方法调用和命令行操作两种方式,如果只是简单处理的话建议api方法 ...

  2. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  3. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  4. javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)

    类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...

  5. 图片懒加载插件lazyload使用方法

    图片懒加载插件lazyload使用方法 一.如何使用: Lazy Load 依赖于 jQuery.引入文件 <script type="text/javascript" sr ...

  6. iOS开发UI篇—Quartz2D使用(图片剪切)

    iOS开发UI篇—Quartz2D使用(图片剪切) 一.使用Quartz2D完成图片剪切 1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: - ...

  7. 【iOS】Quartz2D图片剪切

    一.使用Quartz2D完成图片剪切1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: - (void)drawRect:(CGRect)rec ...

  8. 图片上传,图片剪切jquery.imgareaselect

    ---恢复内容开始--- <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  9. 图片剪裁上传插件 - cropper

    图片剪裁上传插件 - cropper <style> .photo-container{float: left;width: 300px;height: 300px;} .photo-co ...

随机推荐

  1. Codechef Nuclear Reactors 题解

    There are K nuclear reactor chambers labelled from 0 to K-1. Particles are bombarded onto chamber 0. ...

  2. English - according to 的用法说明

    1. 用于according to,意为“根据”,为复合介词,后接名词或代词.注意以下用法: (1) 主要用来表示“根据”某学说.某书刊.某文件.某人所说等或表示“按照”某法律.某规定.某惯例.某情况 ...

  3. Javascript获取浏览器版本

    前两天有朋友请教我这个问题,说现在网上的资料太过于混乱不完整,我这里先简单整理一部分. 0 (function(){ 1   2 var ver = window.navigator.userAgen ...

  4. Convert Sorted List to Balanced Binary Search Tree (BST)

    (http://leetcode.com/2010/11/convert-sorted-list-to-balanced-binary.html) Given a singly linked list ...

  5. request.getParameter中文乱码问题

    http请求是以ISO-8859-1的编码来传送url的 如果页面的content-type为utf-8,那么在发送请求时,会将字符转成utf-8后进行传送              如: 中 的UT ...

  6. 【LeetCode题意分析&解答】38. Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  7. 四轴飞行器1.2.2 RT-Thread 串口

    四轴飞行器1.2.2 RT-Thread 串口        本来是打算说根据RT-Thread的设备管理提供的驱动接口些串口驱动的,但是仔细一看,我去,串口驱动写好了,只需要调用就可以了.下面我们说 ...

  8. HTML编码的用户输入

    public string Browse(string genre) { returen HttpUtility.HtmlEncode(genre); } HttpUtility.HtmlEncode ...

  9. C# 基础中有关术语理解

    一.栈vs堆  深入理解堆栈.堆在内存中的实现 二.Socket 深入探析c# Socket 三.多线程 c# 多线程 --Mutex(互斥锁)

  10. Linux 中执行命令

    第一步: 在txt文件(文件名为cmd_file)中写入代码:echo this is content! 第二步: 授权chmod 555 cmd_file 第三步: 运行 ./cmd_file -- ...