web实现QQ头像上传截取功能

由于最近一段时间比较忙,发现好久没写博客了,给大家分享下最近搞的logo上传截取功能。在实现这个功能之前找了一些jq的插件,最后选定了cropper在github中可以找到。

具体的思路是1:选择上传的图片,在change事件中用form.jquery.js中的formajax异步提交表单,保存上传的图片

2:绑定cooper事件,对图片进行选取。

3:得到选中区域的坐标,对图片进行截取保存。

其中的难点是ie的兼容性问题,由于本人也不是很好,就不献丑了下面给大家附上代码

页面中的html

 <div class="input">
                    <div><span class="xuanze">选择</span><input type="file" class="file" name="file" id="file" onchange="change()" /><span class="jpeg">支持jpg、jpeg、gif、png、bmp格式的图片</span></div>
                    <div class="xiechneg">
                        <span class="daxc">
                            @{
                                var url = Model.LogoMiddleUrl == null ? "" : Model.LogoMiddleUrl;
                                var path200 = ReadConfig.GetHostUrl("Host") + url;
                            }
                            <img src="@path200" width="118" height="49"  />
                        </span><i class="dxgou"></i><i class="dxcha"></i><span class="shuzi01">200*80 </span>
                        <span class="xiaoxc">
                            @{
                                var url1 = Model.LogoSmallUrl == null ? "" : Model.LogoSmallUrl;
                                var path100 = ReadConfig.GetHostUrl("Host") + url1;
                            }
                            <img src="@path100" width="95" height="38"  />
                        </span><i class="xiaoxgou"></i><i class="xiaoxcha"></i><span class="shuzi02">100*40 </span>
                    </div>

                    <div class="yzhz">
                        <div class="xiaoyz">
                            <div class="img-container">

                                <img src="/Content/img/xtsz/xiaoyizi.jpg" width="400" height="280"  id="HeadPic" />
                            </div>
                            <span class="logo">选择本地照片,上传编辑自己的LOGO</span>
                            <span class="qd" onclick="SubmitHead()">确定</span>
                        </div>
                        <div class="ybXC">
                            <span class="lgyl">LOGO预览</span>
                            <div class="img-preview preview-lg">
                            </div>
                            <div class="img-preview preview-md">
                            </div>

                        </div>
                    </div>
                </div>

cropper下载地址http://jquery-plugins.net/image-cropper-jquery-image-cropping-plugin

form.jquery.js的下载地址 http://malsup.com/jquery/form/#download

页面的js

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

<script>

    function change() {

        var pic = document.getElementById("HeadPic"),

            file = document.getElementById("file");

 

        var ext = file.value.substring(file.value.lastIndexOf(".") + 1).toLowerCase();

 

        // gif在IE浏览器暂时无法显示

        if (ext != ‘png‘ && ext != ‘jpg‘ && ext != ‘jpeg‘) {

            alert("图片的格式必须为png或者jpg或者jpeg格式!");

            return;

        }

        var isIE = navigator.userAgent.match(/MSIE/) != null,

            isIE6 = navigator.userAgent.match(/MSIE 6.0/) != null;

 

        if (isIE) {

 

            file.select();

            file.blur();

            var reallocalpath = document.selection.createRange().text;

 

            // IE6浏览器设置img的src为本地路径可以直接显示图片

            if (isIE6) {

                pic.src = reallocalpath;

            } else {

                //// 非IE6版本的IE由于安全问题直接设置img的src无法显示本地图片,但是可以通过滤镜来实现

                //pic.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=‘crop‘,src=\"" + reallocalpath + "\")";

                //// 设置img的src为base64编码的透明图片 取消显示浏览器默认图片

                //pic.src = ‘data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==‘;

                //CutPic();

                $("#HeadForm").ajaxSubmit({

                    type: "POST",

                    url: "/AjaxCommon/UpPic/",

                    dataType: "text",

                    success: function (data) {

                        $("#HeadSrc").val(data);

                        $("#HeadPic").attr("src", "@ReadConfig.GetHostUrl("Host")" + data);

                        CutPic();

                    }

                });

            }

 

        } else {

            html5Reader(file);

        }

    }

 

    function html5Reader(file) {

        var file = file.files[0];

        var reader = new FileReader();

        reader.readAsDataURL(file);

        reader.onload = function (e) {

            var pic = document.getElementById("HeadPic");

            pic.src = this.result;

            $("#HeadForm").ajaxSubmit({

                type: "POST",

                url: "/AjaxCommon/UpPic/",

                dataType: "text",

                success: function (data) {

                    $("#HeadSrc").val(data);

                    CutPic();

                }

            });

            CutPic();

        };

    }

    function CutPic() {

        var $image = $(‘.img-container>img‘);

        var options = {

            aspectRatio: 5 / 2,

            preview: ‘.img-preview‘,

        };

        $image.cropper(options);

    }

 

    function SubmitHead() {

        $.NabianPost({

            url: "/Handler/CutImage.ashx",

            data: {

                filesrc: $("#HeadPic").attr("src"),

                top: parseInt($(".cropper-move").offset().top - $(".cropper-canvas").offset().top),

                left: parseInt($(".cropper-move").offset().left - $(".cropper-canvas").offset().left),

                height: parseInt($(".cropper-move").css("height")),

                width: parseInt($(".cropper-move").css("width")),

                HeadSrc: $("#HeadSrc").val()

            },

            callback: function (data) {

                if (data.status == "no") {

                    alert("对不起上传失败");

                } else {

                    alert("上传成功");

                    window.location.reload();

                }

            }

        });

    }

</script>

  上传图片的方法

 public ActionResult UpPic()
        {
            var file = Request.Files["file"];
            if (file.ContentLength == 0)
            {
                return Content("请选择文件");
            }
            if (file.ContentLength > 307200)
            {
                return Content("文件过大");
            }
            int width = 0; int height = 0;
            string path = ReadEnum.GetFilePath((int)FilePath.GYS_Logo);
            string HostUrl = ReadConfig.GetHostUrl("HostUrl");
            string finalPaht;
            Request.Files.Processing(HostUrl, path, 400, 280, 100, out finalPaht, "GYS_Logo", 11);
            string a = path;
            return Content(a);
        }

截取并保存截取后的图片的handler

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Drawing.Imaging;

using System.IO;

using System.Linq;

using System.Web;

using BCommon.common;

using BLL.BLL;

using Model.Model;

 

namespace www.nabian.com.Handler

{

    /// <summary>

    /// CutImage 的摘要说明

    /// </summary>

    public class CutImage : IHttpHandler, System.Web.SessionState.IRequiresSessionState

    {

 

        /// <summary>

        /// 对图像的裁减操作主入口

        /// </summary>

        /// <param name="context">所有HTTP请求的特定信息</param>

        public void ProcessRequest(HttpContext context)

        {

            context.Response.ContentType = "text/json";

            string fileSource = context.Request["filesrc"];

            //原文件路径和文件名

 

            //文件保存路径

            string HostUrl = ReadConfig.GetHostUrl("HostUrl");

            //minilogo的保存路径

            string path100 = ReadEnum.GetFilePath((int)FilePath.GYS_inLOGO100_40);

            string path200 = ReadEnum.GetFilePath((int)FilePath.GYS_inLOGO200_80);

            int cutY = int.Parse(context.Request["top"]); //Y轴坐标

            int cutX = int.Parse(context.Request["left"]); //X轴坐标

            int cutWidth = int.Parse(context.Request["width"]); //裁减宽度

            int cutHeight = int.Parse(context.Request["height"]); //裁减高度

            string HeadSrc = HostUrl + context.Request["HeadSrc"];

            //裁减后上传

            CutImg(HeadSrc, cutX, cutY, cutWidth, cutHeight, path100, "GYS_inLOGO100_40", context);

            CutImg(HeadSrc, cutX, cutY, cutWidth, cutHeight, path200, "GYS_inLOGO200_80", context);

            //如果文件存在,说明文件上传成功

 

            if (File.Exists(HostUrl + path100) && File.Exists(HostUrl + path200))

            {

                var user = (B_Com_User)context.Session["LoginUser"];

                var com = new B_Com_CompanyBLL().SelectByID(user.CompanyID.ToString());

                com.LogoUrl = HeadSrc;

                com.LogoMiddleUrl = path200;

                com.LogoSmallUrl = path100;

                if (new B_Com_CompanyBLL().UpdateLogoById(com))

                {

                    context.Response.Write("{\"status\":\"ok\"}");

                }

                else

                {

                    context.Response.Write("{\"status\":\"no\"}");

                }

            }

            else

            {

                context.Response.Write("{\"status\":\"error\"}");

            }

        }

 

        /// <summary>

        /// 从指定路径中获取图片,按照指定位置及大小截取相应的图片内容,并保存到指定路径下

        /// </summary>

        /// <param name="filepath">图片来源路径及文件名(已使用Server.MapPath)</param>

        /// <param name="cutX">裁减的起始X轴坐标</param>

        /// <param name="cutY">裁减的起始Y坐标</param>

        /// <param name="cutwidth">裁减的宽度</param>

        /// <param name="cutheight">裁减的高度</param>

        /// <param name="savepath">裁减后的图片名称,路径为上一级的images文件夹中</param>

        /// <param name="context">所有http特定的信息对象</param>

        void CutImg(string filepath, int cutX, int cutY, int cutwidth, int cutheight, string savepath, string fileName, HttpContext context)

        {

            //TODO 判断文件类型暂时未做

 

 

            //创建图像对象,由于web中有个image控件,会导致这个图像的类重复,需要带上使用命名空间

            System.Drawing.Image oldImage = System.Drawing.Image.FromFile(filepath);

 

            //创建一个指定宽高的图像对象

            System.Drawing.Image newImage = new Bitmap(cutwidth, cutheight);

            //创建存放截取图像的画布

            Graphics newGraphics = Graphics.FromImage(newImage);

 

            //创建矩形对象,裁减是就是照着这个矩形来裁减的

            Rectangle CutReatangle = new Rectangle(cutX, cutY, cutwidth, cutheight);

            //创建矩形对象,用于下面的指定裁减出来的图像在新画布上的显示情况

            Rectangle showRectangle = new Rectangle(0, 0, cutwidth, cutheight);

            //执行裁减操作

            newGraphics.DrawImage(oldImage, showRectangle, CutReatangle, GraphicsUnit.Pixel);

 

            //释放资源(除图像对象的资源)

            oldImage.Dispose();

            newGraphics.Dispose();

            DateTime time = DateTime.Now;

            CreateFile.CreateFolder(ReadConfig.GetHostUrl("HostUrl") + ReadConfig.GetHostUrl(fileName) + "\\" + time.Year + "\\" + time.Month + "\\" + time.Day + "\\");

            //保存新图到指定路径

            //newImage.Save(ReadConfig.GetHostUrl("HostUrl") + savepath, System.Drawing.Imaging.ImageFormat.Jpeg);

            if (fileName == "GYS_inLOGO100_40")

            {

                newImage.ImageWinvarOptions(ReadConfig.GetHostUrl("HostUrl") + savepath, 100, 40, 100);

            }

            else

            {

                newImage.ImageWinvarOptions(ReadConfig.GetHostUrl("HostUrl") + savepath, 200, 80, 100);

            }

            //释放新图像的资源,如果在保存前释放,会造成程序出错

            newImage.Dispose();

 

        }

 

        /// <summary>

        /// 判断原始文件后缀是否符合要求规范

        /// </summary>

        /// <param name="filepath">原始文件路径</param>

        /// <returns>true为符合</returns>

        bool CheckImageMime(string filepath)

        {

            int typeLastShow = filepath.LastIndexOf(‘.‘);

            string[] imageType = { "jpg", "gif", "png", "bmp" };

            for (int i = 0; i < imageType.Length; i++)

            {

                //如果有后缀名且后缀符合规范

                if (typeLastShow > 0 && imageType[i].Equals(filepath.Substring(typeLastShow + 1), StringComparison.OrdinalIgnoreCase))

                {

                    return true;

                }

            }

 

            return false;

        }

 

        /// <summary>

        /// 根据原始文件名返回前面加上操作时间的文件名

        /// </summary>

        /// <param name="filepath">原文件全名(路径+文件名称)</param>

        /// <returns>新的文件名称</returns>

        string NewFileName(string filepath)

        {

            //获取文件原名

            string oldFileName = filepath.Substring(filepath.LastIndexOf("\\") + 1);

 

            //获取操作时间,原使用的是yyyyMMddHHmmssffff

            string date = DateTime.Now.ToString("yyyyMMddHHmmss") + DateTime.Now.Millisecond.ToString();

 

            //新文件名

            string newFileName = date + oldFileName;

            return newFileName;

        }

 

 

 

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

  压缩图片的方法

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BCommon.common
{
    public static class ImageWinvar
    {
        /// <summary>
        /// 无损压缩图片
        /// </summary>
        /// <param name="img">原图片的文件流</param>
        /// <param name="dFile">压缩后保存位置</param>
        /// <param name="dHeight">高度</param>
        /// <param name="dWidth"></param>
        /// <param name="flag">压缩质量 1-100</param>
        /// <returns></returns>
        public static bool ImageWinvarOptions(this Image img, string dFile, int dWidth, int dHeight, int flag)
        {
            ImageFormat tFormat = img.RawFormat;
            int sW = 0, sH = 0;
            //按比例缩放
            Size tem_size = new Size(img.Width, img.Height);
            if (tem_size.Width > dHeight || tem_size.Width > dWidth) //将**改成c#中的或者操作符号
            {
                if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth))
                {
                    sW = dWidth;
                    sH = (dWidth * tem_size.Height) / tem_size.Width;
                }
                else
                {
                    sH = dHeight;
                    sW = (tem_size.Width * dHeight) / tem_size.Height;
                }
            }
            else
            {
                sW = tem_size.Width;
                sH = tem_size.Height;
            }
            Bitmap ob = new Bitmap(dWidth, dHeight);
            Graphics g = Graphics.FromImage(ob);
            g.Clear(Color.WhiteSmoke);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage(img, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
            g.Dispose();
            //以下代码为保存图片时,设置压缩质量
            EncoderParameters ep = new EncoderParameters();
            long[] qy = new long[1];
            qy[0] = flag;//设置压缩的比例1-100
            EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
            ep.Param[0] = eParam;
            try
            {
                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo jpegICIinfo = null;
                for (int x = 0; x < arrayICI.Length; x++)
                {
                    if (arrayICI[x].FormatDescription.Equals("JPEG"))
                    {
                        jpegICIinfo = arrayICI[x];
                        break;
                    }
                }
                if (jpegICIinfo != null)
                {
                    ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径
                }
                else
                {
                    ob.Save(dFile, tFormat);
                }
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                img.Dispose();
                ob.Dispose();
            }
        }

    }
}

时间: 2024-10-11 06:05:58

web实现QQ头像上传截取功能的相关文章

web开发经验——富头像上传编辑器的使用

富头像编辑器是一个很好的头像图片上传控件,能够对图片进行简单的处理,例如:剪切.调节亮度等功能:富头像编辑器拥有很的参数配置,可根据自己的需要配置控件的功能:该控件要求浏览器需安装Flash Player后才能使用:下面是我做的一个小的Demo以说明富头像编辑器的使用方法. 1.前台页面 需引用js文件和初始化富头像编辑器,脚本代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /

Yii2.0 集成使用富头像上传编辑器

在开发过程中,我们会用到头像上传的功能.这里给大家推荐一款比较流行的头像上传组件,FullAvatarEditor 2.3(富头像上传编辑器). 实际效果如图所示: 1.下载组件,下载地址:http://www.fullavatareditor.com/download.html: 2.在所需页面上导入相关js文件: <script type="text/javascript" src="FullAvatarEditor2.3/scripts/swfobject.js&

移动端web头像上传实现截取和照片方向修复

实战所需js包: jQuery.Jcrop.EXIF 本次实战功能是在 app 中的 我的客户 的客户信息页面中实现移动端web的头像上传,本次没有实现图像拖拽.缩放的触摸事件功能(Jcrop在这方面的扩展支持实在不够良好,弄了半天没弄出来),若后续有更好的移动端web头像上传插件,可考虑后续替代升级. demo主要实现的关键功能: 图像的方向修正及图像截取 虽然没有实现图像拖拽和双指缩放,但其缩放后的相对于图像的比例计算和拖拽坐标计算规则是一致的,可以参考.同时图像的旋转功能也可参考其中的核心

[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能

很久没有更新博客了,再不写点东西都烂了. 这次更新一个小内容,是两个插件的组合使用,实现头像上传功能. 业务需求: 头像上传功能,要对上传的文件进行剪切,且保证头像到服务器时必须是正方形的. 优化<input type="file">的显示样式,基础的样式实在太难看了. 上传的头像需要进行质量压缩跟大小裁剪,以减缓浏览器的压力. 成果预览: 使用到的技术插件 Jcrop:用于前端"裁剪"图片 bootstrap-fileinput:用于前端优化上传控件样

【Bootstrap-插件使用】Jcrop+fileinput组合实现头像上传功能

作者:Dreawer链接:https://zhuanlan.zhihu.com/p/24465742来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:梦游的龙猫(转载已获得作者许可) 很久没有更新博客了,再不写点东西都烂了. 这次更新一个小内容,是两个插件的组合使用,实现头像上传功能. 业务需求: 头像上传功能,要对上传的文件进行剪切,且保证头像到服务器时必须是正方形的. 优化<input type="file">的显示样式,基础的样式实

qt实现头像上传功能

想必大家都使用过qt的自定义头像功能吧,那么图1应该不会陌生,本片文章我就是要模拟一个这样的功能,虽然没有这么强大的效果,但是能够满足一定的需求. 图1 qq上传图片 首先在讲解功能之前,我先给出一片文章,QT实现的类似QQ的头像选择框,这篇文章也是讲解头像上传功能的,而我自己的代码是从这个demo中优化而来,不仅对代码进行了重构,而且处理了快速拖动时,边框消失的问题.使用事件和双缓冲来尽量减少重新绘制的几率.接下里我会一步一步进行讲解,怎么实现图片自定义截取功能.一.概要首选,我给出4个类,并

富头像上传编辑器----很好用的上传照片和拍照功能

富头像编辑器是一个很好的头像图片上传控件,能够对图片进行简单的处理,例如:剪切.调节亮度等功能:富头像编辑器拥有很的参数配置,可根据自己的需要配置控件的功能:该控件要求浏览器需安装Flash Player后才能使用:下面是我做的一个小的Demo以说明富头像编辑器的使用方法. 1.前台页面 需引用js文件和初始化富头像编辑器,脚本代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /

我需要在Web上完成一个图片上传的功能

我需要在Web上完成一个图片上传的功能. 这个页面需要能从手机中选择图片上传. 首先,这个页面是从微信上面触发的,所以修改了微信的的入口地址,增加了身份识别号作为传参. 跳转到页面的时候,页面先检查身份识别号是否已参与过本次活动,参与过本次活动的,可以跳转到变更图片功能.如果未参与过图片上传,则需要传入图片. 看上去是很简单的逻辑. 马上行动.

java web 网站头像上传处理 (springmvc +bootstrap+cropper)

制作头像上传.请根据您的实际需求,修改代码,不完全正确,仅供参考! 前端页面设计使用bootstrap ,头像预览和剪裁工具使用cropper 后台使用springmvc. 现在来看前端的页面设计 前端页面设计,自然需要bootstrap .jqury 和cropper ,这可以自行去网上百度查找 剪裁效果图 html 文件 <!DOCTYPE html> <html> <head lang="en"> <meta charset="