MVC 上传图片,裁剪头像

2019-01-17  本文已影响0人  JuneY

头次在简书写东西,有什么问题多指教。

之前在做一个网站用户上传头像(可裁剪)功能,整理成文,如下:

1、选择插件,引用JS

(1)选上传图片的插件:我用的是=> fileupload ,网上下载包里面会有很多文件,这边引用了3个文件(最重要的 jquery 记得引)

jquery.iframe-transport.js

jquery.ui.widget.js

jquery.fileupload.js

(2)截取图片 cutpic.js

2、写前台上传图片 AJAX 语句

<input type="file" id="fileupload" name="files[]" multiple style="position: absolute; opacity: 0; -ms-filter: 'alpha(opacity=0)'; font-size: 1px;direction: ltr;cursor: pointer;margin-left: -50px;width: 100px; direction: ltr; cursor: pointer;">

$(function () {

    $("#tripMsg").hide();

    $("#removeMsgerror").hide();

    $("#fileupload").fileupload({

        url: "/FileUpload/UploadThumbImg",//后台操作路径

        dataType: 'json',

        add: function (e, data) {

            $("#removeMsgerror").hide();

            data.submit();

        },

        done: function (e, data) {

            //done方法就是上传完毕的回调函数

            //注意result要和jquery的ajax的data参数区分,这个对象包含了整个请求信息 

            //返回的数据在result.result中,假设我们服务器返回了一个json对象 

            var res = data.result;

            if (res.Success) {

              //上传好图片只有做的一些操作

                    ShowImg(res.ShowImage, result[1], result[2]);      //在截图区显示

                }

            }

            else {

                $("#hidErr").val()

                alert(res.Message);

            }

        }

//移动要裁剪图片的区域之后点保存的操作

$("#btnSave").click(function () {

        $.ajax({

            type: "POST",

            url: "/FileUpload/UploadImg",

            data: { imgUrl: $('#hidImageUrl').val(), pointX: $("#x").val(), pointY: $("#y").val(), maxVal: $("#maxVal").val() },

            success: function (msg) {

                if (msg.Success) {

                }

                else {

                    alert(msg.ReturnData);

                }

            },

            error: function (xhr, msg, e) {

                alert("error");

            }

        });

    });

    });

function ShowImg(imagePath, imgWidth, imgHeight) {

    var imgPath = imagePath != "" ? imagePath : "!images/ef_pic.jpg";

    var ic = new ImgCropper("bgDiv", "dragDiv", imgPath, imgWidth, imgHeight, null);

}

3、后台操作

传好图片保存,获得截图并保存

public JsonResult UploadThumbImg()

        {

            var CurrentContext = HttpContext;

            // 获取文件流

            var files = CurrentContext.Request.Files;

            if (files.Count > 0)

            {

                Stream stream = null;

                System.Drawing.Image originalImg = null;  //原图 

                int minWidth = 94;  //最小宽度

                int minHeight = 94;  //最小高度

                int maxWidth = 300;  //最大宽度

                int maxHeight = 300;  //最大高度

                string imageOfSize = string.Empty;  //返回信息

                try

                {

                    // 文件上传后的保存路径

                    String pathOnServer = Path.Combine(StorageRoot);//StorageRoot 路径,我写的是全局变量,因为很多地方用到

                    string filePath = pathOnServer + "/Users/" + userName.ToLower() + "/" + loginType + "/";

                    string uploadFilePath = filePath;

                    string ext = Path.GetExtension(files[0].FileName).ToLower();  //上传文件的后缀(小写)

                    if (!Directory.Exists(filePath))

                    {

                        Directory.CreateDirectory(filePath);

                    }

                    string fileName = Path.GetFileName(files[0].FileName);// 原始文件名称

                    string saveName = Guid.NewGuid().ToString() + ext; // 保存文件名称

                    string flag = "/temp" + DateTime.Now.ToFileTime() + ext;

                    if (ext == ".jpg" || ext == ".png")

                    {

                        uploadFilePath += "\\" + flag;  //图文件路径

                        stream = files[0].InputStream;

                        originalImg = System.Drawing.Image.FromStream(stream);

                        if (originalImg.Width >= minWidth && originalImg.Height >= minHeight)

                        {

                            originalImg.Save(uploadFilePath);

                                imageOfSize = "Temp" + "$" + originalImg.Width + "$" + originalImg.Height;

                        }

                        else

                        {

                            return Json(new { Success = false, Message = "Image size must be larger than " + minWidth + "*" + minHeight }, JsonRequestBehavior.AllowGet);//图片尺寸必须大于

                        }

                    }

                    else

                        return Json(new { Success = false, Message = "The image format should be .jpg or .png" }, JsonRequestBehavior.AllowGet);//请输入正确图片格式

                    return Json(new { Success = true, FileName = fileName, SaveName = saveName, ShowImage = UrlBase + "/Users/" + userName.ToLower() + "/" + loginType + "/" + flag, ThumbImgPath = "/Users/" + userName.ToLower() + "/" + loginType + "/" + flag, ImageOfSize = imageOfSize });

                }

                catch (Exception ex)

                {

                    return Json(new { Success = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);

                }

                finally

                {

                    if (originalImg != null)

                    {

                        originalImg.Dispose();

                    }

                    if (stream != null)

                    {

                        stream.Close();

                        stream.Dispose();

                    }

                    GC.Collect();

                }

            }

            else

            {

                return Json(new { Success = false, Message = "Please select the file to upload!" }, JsonRequestBehavior.AllowGet);//请选择要上传的文件!

            }

        }

[HttpPost]

        public JsonResult UploadImg(string pointX, string pointY, string imgUrl, string maxVal)

        {

            //Bitmap bitmap = null;  //按截图区域生成Bitmap

            Image thumbImg = null;      //被截图

            //Graphics gps = null;    //存绘图对象 

            Image cutImage = null;

            Image finalImg = null;  //最终图片

            string savePath = string.Empty;

            string msg = string.Empty;

            string fileName = string.Empty;

            bool result=true;

            if (!string.IsNullOrEmpty(pointX) && !string.IsNullOrEmpty(pointY) && !string.IsNullOrEmpty(imgUrl))

            {

                try

                {

                    int finalWidth = 94;

                    int finalHeight = 94;

                    var userName = Request.Cookies["userName"].Value;

                    var loginType = Request.Cookies["loginType"].Value;

                    ClientSiteUser cMod = bll.GetClientUserById(userName);

                    int X = Convert.ToInt32(pointX);

                    int Y = Convert.ToInt32(pointY);

                    string ext = System.IO.Path.GetExtension(imgUrl).ToLower();  //上传文件的后缀(小写)

                    string pathOnServer = Path.Combine(StorageRoot);

                    string documentUrl = "/Users/" + userName.ToLower() + "/" + loginType;//存放文件夹

                    string docStr = pathOnServer + documentUrl;//上传路径

                    if (!string.IsNullOrWhiteSpace(userName) && cMod != null)

                    {

                        //获取截图 1、创建画布

                        //bitmap = new System.Drawing.Bitmap(Convert.ToInt32(maxVal), Convert.ToInt32(maxVal));

                        thumbImg = System.Drawing.Image.FromFile(pathOnServer + imgUrl);

                        //System.Drawing.Rectangle rl = new System.Drawing.Rectangle(Convert.ToInt32(pointX), Convert.ToInt32(pointY), Convert.ToInt32(maxVal), Convert.ToInt32(maxVal));  //得到截图矩形

                        //gps = System.Drawing.Graphics.FromImage(bitmap);

                        //// 在指定位置并且按指定大小绘制指定的 Image 的指定部分,获得到截图

                        //gps.DrawImage(thumbImg, 0, 0, rl, System.Drawing.GraphicsUnit.Pixel);

                        cutImage = GetCutImage(Convert.ToInt32(pointX), Convert.ToInt32(pointY), thumbImg, Convert.ToInt32(maxVal));

                        //截图等比例缩放得到最终图片

                        finalImg = GetThumbImage(cutImage, finalWidth, finalHeight);

                        fileName = "/Img" + DateTime.Now.ToFileTime() + ext;

                        savePath = docStr + fileName;

                        if (!string.IsNullOrWhiteSpace(cMod.UrlOfAvatarPicture))

                        {

                            FileDel(cMod.UrlOfAvatarPicture);

                        }

                        msg = UrlBase + documentUrl + fileName;

                        cMod.UrlOfAvatarPicture = documentUrl + fileName;

                        //将图片路径保存至数据库

                        if (bll.UpdateUrlOfAvatarPicture(cMod))

                        {

                            if (!System.IO.Directory.Exists(docStr))

                            {

                                System.IO.Directory.CreateDirectory(docStr);

                            }

                            finalImg.Save(savePath);

                        }

                        else result = false;

                        //显示释放资源

                        //bitmap.Dispose();

                        thumbImg.Dispose();

                        //gps.Dispose();

                        cutImage.Dispose();

                        finalImg.Dispose();

                        GC.Collect();

                        FileDel(imgUrl);

                    }

                }

                catch (Exception ex)

                {

                    result = false;

                    msg = ex.Message;

                }

            }

            return Json(new { Success = result,ReturnData=msg });

        }

///<summary>

        /// 裁剪图片

        ///</summary>

        ///<param name="originalImage">原始图片</param>

        ///<param name="thumMaxWidth">裁剪后需要显示的宽度</param>

        ///<param name="thumMaxHeight">裁剪后需要显示的高度</param>

        ///<returns>返回裁剪后的Image对象</returns>

        public static System.Drawing.Image GetThumbImage(Image originalImage, int thumMaxWidth, int thumMaxHeight)

        {

            Image newImage = originalImage;

            Graphics graphics = null;

            try

            {

                // 创建画布

                newImage = new Bitmap(originalImage.Width, originalImage.Height);

                graphics = Graphics.FromImage(newImage);

                // 指定高质量、低速度呈现。

                graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

                // 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。

                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

                graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

                // 用白色清空

                graphics.Clear(System.Drawing.Color.Transparent);

                // 在指定位置并且按指定大小绘制指定的 Image 的指定部分。

                graphics.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, thumRealSize.Width, thumRealSize.Height), new System.Drawing.Rectangle(0, 0, originalImage.Width, originalImage.Height), System.Drawing.GraphicsUnit.Pixel);

            }

            catch { }

            finally

            {

                if (graphics != null)

                {

                    //显示释放资源

                    graphics.Dispose();

                    graphics = null;

                }

            }

            return newImage;

        }

上传成功显示到裁剪区

 裁剪保存成功,右上角是裁剪后的图片

参考自:https://www.cnblogs.com/wifi/articles/2573131.html

上一篇下一篇

猜你喜欢

热点阅读