• Jcrop简单实用


    今天有一个项目的功能需求 “在上传照片的时候能进行裁剪”,网上找了下,发现有Jcrop这款插件,自己试了下,感觉很不错,蛮好用的。又能增加用户体验,测试了兼容性也很好,所以在这里分享下

     首先,可以到官网上下载这款插件 htttp://www.jquery.com ,下载后有需要的话可以看下里面的demo

    在项目中,只要在head中引用

        <link href="jquery.Jcrop.css" rel="stylesheet" type="text/css" />
        <script src="jquery-1.7.1.js" type="text/javascript"></script>
        <script src="jquery.Jcrop.js" type="text/javascript"></script>

    前台页面,要加上4个隐藏域,分别记录剪切后的x,y坐标和长,宽。附上代码

        <div>
        <!--需要剪切的图片-->
            <img src="gq_nav.jpg" alt="" id="TestImage" style="float: left;">
        </div>
        <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>
        <!--简介后显示的图片-->
        <img id="CutImage" />

    接着实例化Jcrop

       <script>
            $(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 (imgUrl) {
                            $("#CutImage").attr("src", imgUrl);
                        }
                    });
                    return false;
                });
            });
            function updateCoords(c) {
                $('#x').val(c.x);
                $('#y').val(c.y);
                $('#w').val(c.w);
                $('#h').val(c.h);
            };
        </script>

    之后看下运行效果图

    好了,效果出来了,然后要保存截取后的图片了,这样在刚刚的脚本中可以看到用ajax提交到Handler.ashx上去处理,附上代码

    public void ProcessRequest(HttpContext context)
        {
            
            //接收位置x,y。
            //接收长宽w,h。
            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("gq_nav.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);    //输出保存的路径,以便页面端接收路径显示切割后的图片
        }

    Handler.ashx中可以看到生成新的图片是交给ImageCut这个类去做的,这里也附上代码

    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;
        }
    }

    这样就可以实现在线剪裁图片的效果了。因为觉得这款插件还算不错,所以特此分享下,希望大师们不要取笑,如果哪位有更好的建议或其他类似的插件,也希望
    能分享给小弟。

    另:附上这个插件的属性

    allowSelect true 允许新选框
    allowMove true 允许选框移动
    allowResize true 允许选框缩放
    trackDocument true  
    baseClass “jcrop” 基础样式名前缀。说明:class=”jcrop-holder”,更改的只是其中的 jcrop。
    addClass null 添加样式。例:假设值为 “test”,那么会添加样式到
    bgColor “black” 背景颜色。颜色关键字、HEX、RGB 均可。
    bgOpacity 0.6 背景透明度
    bgFade false 使用背景过渡效果
    borderOpacity 0.4 选框边框透明度
    handleOpacity 0.5 缩放按钮透明度
    handleSize 9 缩放按钮大小
    handleOffset 5 缩放按钮与边框的距离
    aspectRatio 0 选框宽高比。说明:width/height
    keySupport true 支持键盘控制。按键列表:上下左右(移动)、Esc(取消)、Tab(跳出裁剪框,到下一个)
    cornerHandles true 允许边角缩放
    sideHandles true 允许四边缩放
    drawBorders true 绘制边框
    dragEdges true 允许拖动边框
    fixedSupport true  
    touchSupport null  
    boxWidth 0 画布宽度
    boxHeight 0 画布高度
    boundary 2 边界。说明:可以从边界开始拖动鼠标选择裁剪区域
    fadeTime 400 过度效果的时间
    animationDelay 20 动画延迟
    swingSpeed 3 过渡速度
    minSelect [0,0] 选框最小选择尺寸。说明:若选框小于该尺寸,则自动取消选择
    maxSize [0,0] 选框最大尺寸
    minSize [0,0] 选框最小尺寸
    onChange function(){} 选框改变时的事件
    onSelect function(){} 选框选定时的事件
    onRelease function(){} 取消选框时的事件

    API 接口

    名称说明
    setImage(string) 设定(或改变)图像。例:jcrop_api.setImage(“newpic.jpg”)
    setOptions(object) 设定(或改变)参数,格式与初始化设置参数一样
    setSelect(array) 创建选框,参数格式为:[x,y,x2,y2]
    animateTo(array) 用动画效果创建选框,参数格式为:[x,y,x2,y2]
    release() 取消选框
    disable() 禁用 Jcrop。说明:已有选框不会被清除。
    enable() 启用 Jcrop
    destroy() 移除 Jcrop
    tellSelect() 获取选框的值(实际尺寸)。例子:console.log(jcrop_api.tellSelect())
    tellScaled() 获取选框的值(界面尺寸)。例子:console.log(jcrop_api.tellScaled())
    getBounds() 获取图片实际尺寸,格式为:[w,h]
    getWidgetSize() 获取图片显示尺寸,格式为:[w,h]
    getScaleFactor() 获取图片缩放的比例,格式为:[w,h]

    如果你觉得本文对你有帮助,可以在右边随意 打赏 博主 ~(≧▽≦)/~

    ,,O(_)O~~~~

    作者:最爱晴天
    出处:http://www.cnblogs.com/qtqq/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 究法律责任的权利。
     
  • 相关阅读:
    mysql 连接语句
    mysql 查询
    Mysql 创建数据库表(删除,删除,插入)
    Mysql 数据类型
    添物 不花钱学计算机及编程(预备篇)— 编译原理
    添物不花钱学计算机及编程(预备篇)— 计算机组成和原理
    添不花钱学计算机及编程(预备篇)— 操作系统
    添物 不花钱学计算机及编程(预备篇)- 汇编语言
    python 几种点积运算方式效率分析
    AndroidSweetSheet:ViewPager的实现(2)
  • 原文地址:https://www.cnblogs.com/qtqq/p/3711076.html
Copyright © 2020-2023  润新知