mvc4 截取上传图片做头像
mvc4 截取上传图片做头像,自动生成不同小尺寸缩略图
多SNS网站,可以上传头像,微博也是一样,上传的头像经自由裁剪合适后,自动生成多种不同尺寸高质量清晰的,如大中小。
效果如下:(下载链接在最下面)
实现:
页面代码:
<p class = "phototxt" >选择你要上传的头像</p> <div class = "upfile" > @ using (Html.BeginForm( "uploadHead" , "ucenter" , FormMethod.Post, new { ID = "user_head_form" , enctype = "multipart/form-data" })){ <input type= "file" name= "head" class = "filebtn" onchange= "$('#user_head_upload_box').hide();$('#user_head_show_box').show();$('#user_head_form').submit();" /> <input type= "button" class = "upimgbtn" value = "上传头像" /> } </div>
<div class = "sysbtn" > @ using (Html.BeginForm( "saveHead" , "ucenter" , FormMethod.Post, new { ID = "user_head_param_form" , enctype = "multipart/form-data" })) { @Html.HiddenFor(model => model.headFileName, new { id = "head_name" }) @Html.HiddenFor(model => model.x, new { id = "head_x" }) @Html.HiddenFor(model => model.y, new { id = "head_y" }) @Html.HiddenFor(model => model.width, new { id = "head_width" }) @Html.HiddenFor(model => model.height, new { id = "head_height" }) <input type= "submit" class = "btnyes" value = "保存" > <input type= "button" class = "btnno" value = "取消" onclick= "cancelHead();" > } </div>
section Scripts { <script src= "@Url.Content(" ~/Scripts/jquery-1.7.1.min.js ")" ></script> <script src= "@Url.Content(" ~/Scripts/jquery.form.js ")" ></script> <script src= "@Url.Content(" ~/Scripts/imgareaselect/jquery.imgareaselect.pack.js ")" ></script> <script src= "@Url.Content(" ~/Scripts/head.js ")" ></script> <script src= "@Url.Content(" ~/Scripts/popup.js ")" ></script> <script type= "text/javascript" > $(document).ready(function () { $( "#user_head_form" ).ajaxForm({ success: function (data) { $( '#user_head_upload_box' ).show(); $( '#user_head_show_box' ).hide(); if (data != undefined && data != null ) { if (data.msg == 0) { showreward( "<span class=\"g_error\">请上传图片!</span>" ); } else if (data.msg == -1) { showreward( "<span class=\"g_error\">文件格式不对!</span>" ); } else if (data.msg == -2) { showreward( "<span class=\"g_error\">上传图片不能超过10M!</span>" ); } else if (data.msg == -3) { showreward( "<span class=\"g_error\">出现异常,请稍后再试!!</span>" ); } else { var path = "/avatar/temp/" + data.msg; $( "#head_name" ).val(data.msg); UserHeadUtil.initialize(path); } } } }); $( "#user_head_param_form" ).ajaxForm({ success: function (data) { if (data.msg == 0) { showreward( "<span class=\"g_error\">网络出现异常,请稍后再试!</span>" ); } else if (data.msg == -1) { showreward( "<span class=\"g_error\">系统出现异常,请稍后再试!</span>" ); } else { showreward( "<span class=\"g_ok\">修改成功!</span>" ); $( "img#origin_user_head_75" ).attr( "src" , "/avatar/75/" + data); $( "img#top_user_head_25" ).attr( "src" , "/avatar/25/" + data); $( 'img#user_head_origin' ).imgAreaSelect({ remove: true }); $( "#user_head_show_box" ).hide(); $( "#user_head_upload_box" ).show(); $( "#user_head_origin" ).attr({ "src" : "/Content/img/upload.png" , "width" : "100%" , "height" : "100%" }); } } }); }); </script> }
后台代码:
[HttpPost] public ActionResult uploadHead(HttpPostedFileBase head) //命名和上传控件name 一样 { try { if ((head == null )) { return Json( new { msg = 0 }); } else { var supportedTypes = new [] { "jpg" , "jpeg" , "png" , "gif" , "bmp" }; var fileExt = System.IO.Path.GetExtension(head.FileName).Substring(1); if (!supportedTypes.Contains(fileExt)) { return Json( new { msg = -1 }); } if (head.ContentLength > 1024 * 1000 * 10) { return Json( new { msg = -2 }); } Random r = new Random(); var filename = DateTime.Now.ToString( "yyyyMMddHHmmss" ) + r.Next(10000) + "." + fileExt; var filepath = Path.Combine(Server.MapPath( "~/avatar/temp" ), filename); head.SaveAs(filepath); return Json( new { msg = filename }); } } catch (Exception) { return Json( new { msg = -3 }); } } [HttpPost] [ValidateInput( false )] public ActionResult saveHead() { UploadImageModel model = new UploadImageModel(); model.headFileName = Request.Form[ "headFileName" ].ToString(); model.x = Convert.ToInt32(Request.Form[ "x" ]); model.y = Convert.ToInt32(Request.Form[ "y" ]); model.width = Convert.ToInt32(Request.Form[ "width" ]); model.height = Convert.ToInt32(Request.Form[ "height" ]); if ((model == null )) { return Json( new { msg = 0 }); } else { var filepath = Path.Combine(Server.MapPath( "~/avatar/temp" ), model.headFileName); string fileExt = Path.GetExtension(filepath); Random r = new Random(); var filename = DateTime.Now.ToString( "yyyyMMddHHmmss" ) + r.Next(10000) + fileExt; var path180 = Path.Combine(Server.MapPath( "~/avatar/180" ), filename); var path75 = Path.Combine(Server.MapPath( "~/avatar/75" ), filename); var path50 = Path.Combine(Server.MapPath( "~/avatar/50" ), filename); var path25 = Path.Combine(Server.MapPath( "~/avatar/25" ), filename); cutAvatar(filepath, model.x, model.y, model.width, model.height, 75L, path180, 180); cutAvatar(filepath, model.x, model.y, model.width, model.height, 75L, path75, 75); cutAvatar(filepath, model.x, model.y, model.width, model.height, 75L, path50, 50); cutAvatar(filepath, model.x, model.y, model.width, model.height, 75L, path25, 25); return Json( new { msg = 1 }); } } /// <summary> /// 创建缩略图 /// </summary> public void cutAvatar( string imgSrc, int x, int y, int width, int height, long Quality, string SavePath, int t) { Image original = Image.FromFile(imgSrc); Bitmap img = new Bitmap(t, t, PixelFormat.Format24bppRgb); img.MakeTransparent(img.GetPixel(0, 0)); img.SetResolution(72, 72); using (Graphics gr = Graphics.FromImage(img)) { if (original.RawFormat.Equals(ImageFormat.Jpeg) || original.RawFormat.Equals(ImageFormat.Png)|| original.RawFormat.Equals(ImageFormat.Bmp)) { gr.Clear(Color.Transparent); } if (original.RawFormat.Equals(ImageFormat.Gif)) { gr.Clear(Color.White); } gr.InterpolationMode = InterpolationMode.HighQualityBicubic; gr.SmoothingMode = SmoothingMode.AntiAlias; gr.CompositingQuality = CompositingQuality.HighQuality; gr.PixelOffsetMode = PixelOffsetMode.HighQuality; gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; using (var attribute = new System.Drawing.Imaging.ImageAttributes()) { attribute.SetWrapMode(WrapMode.TileFlipXY); gr.DrawImage(original, new Rectangle(0, 0, t, t), x, y, width, height, GraphicsUnit.Pixel, attribute); } } ImageCodecInfo myImageCodecInfo = GetEncoderInfo( "image/jpeg" ); if (original.RawFormat.Equals(ImageFormat.Jpeg)) { myImageCodecInfo = GetEncoderInfo( "image/jpeg" ); } else if (original.RawFormat.Equals(ImageFormat.Png)) { myImageCodecInfo = GetEncoderInfo( "image/png" ); } else if (original.RawFormat.Equals(ImageFormat.Gif)) { myImageCodecInfo = GetEncoderInfo( "image/gif" ); } else if (original.RawFormat.Equals(ImageFormat.Bmp)) { myImageCodecInfo = GetEncoderInfo( "image/bmp" ); } Encoder myEncoder = Encoder.Quality; EncoderParameters myEncoderParameters = new EncoderParameters(1); EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, Quality); myEncoderParameters.Param[0] = myEncoderParameter; img.Save(SavePath, myImageCodecInfo, myEncoderParameters); } //根据长宽自适应 按原图比例缩放 private static Size GetThumbnailSize(System.Drawing.Image original, int desiredWidth, int desiredHeight) { var widthScale = ( double )desiredWidth / original.Width; var heightScale = ( double )desiredHeight / original.Height; var scale = widthScale < heightScale ? widthScale : heightScale; return new Size { Width = ( int )(scale * original.Width), Height = ( int )(scale * original.Height) }; } private static ImageCodecInfo GetEncoderInfo(String mimeType) { int j; ImageCodecInfo[] encoders; encoders = ImageCodecInfo.GetImageEncoders(); for (j = 0; j < encoders.Length; ++j) { if (encoders[j].MimeType == mimeType) return encoders[j]; } return null ; } }
前端脚本:
//原图/缩略图 的比例 >=1 var UserHeadUtil = { ratio: 1, view_H:300, view_W:300, initialize: function (path){ $( "#user_head_origin" ).attr( "src" , path); $( "#user_head_upload_box" ).hide(); $( "#user_head_show_box" ).show(); $( "#user_head_25" ).attr( "src" , path); $( "#user_head_50" ).attr( "src" , path); $( "#user_head_75" ).attr( "src" , path); $( "#user_head_180" ).attr( "src" , path); var img = new Image(); img.src = path; if (img.width==0){ var obj = this ; img.onload = function (){ obj.imgOperate(img); }; } else { this .imgOperate(img); } }, imgOperate: function (img){ if (img){ this .resize( 'user_head_origin' , img.width, img.height, 300, 300); var x=0,y=0,size=0; if ( this .view_W > this .view_H ){ x = ( this .view_W - this .view_H)/2; size = this .view_H; } else if ( this .view_W < this .view_H){ y = ( this .view_H - this .view_W)/2; size = this .view_W; } else { size = this .view_W; } var obj = this ; $( 'img#user_head_origin' ).imgAreaSelect({ aspectRatio: "1:1" , handles: "corners" , persistent: true , show: true , imageWidth: obj.view_W, imageHeight: obj.view_H, x1: x, y1: y, x2: x + size, y2: y + size, onSelectChange: function (img, selection){ obj.preview( 'user_head_25' , obj.view_W, obj.view_H, selection.x1, selection.y1, selection.width, selection.height, 25, 25); obj.preview( 'user_head_50' , obj.view_W, obj.view_H, selection.x1, selection.y1, selection.width, selection.height, 50, 50); obj.preview( 'user_head_75' , obj.view_W, obj.view_H, selection.x1, selection.y1, selection.width, selection.height, 75, 75); obj.preview( 'user_head_180' , obj.view_W, obj.view_H, selection.x1, selection.y1, selection.width, selection.height, 180, 180); obj.setCutParams(selection.x1, selection.y1, selection.width, selection.height); } }); this .preview( 'user_head_25' , this .view_W, this .view_H, x, y, size, size, 25, 25); this .preview( 'user_head_50' , this .view_W, this .view_H, x, y, size, size, 50, 50); this .preview( 'user_head_75' , this .view_W, this .view_H, x, y, size, size, 75, 75); this .preview( 'user_head_180' , this .view_W, this .view_H, x, y, size, size, 180, 180); this .setCutParams(x, y, size, size); } }, resize: function (id, width, height, limit_W, limit_H){ if (width>0 && height>0){ if (width/height >= limit_W/limit_H){ if (width > limit_W){ this .view_W = limit_W; this .view_H = (limit_W/width)*height; } } else { if (height > limit_H){ this .view_H = limit_H; this .view_W = (limit_H/height)*width; } } $( '#' +id).attr( { "width" : this .view_W, "height" : this .view_H }); this .ratio = width / this .view_W; } }, preview: function (id, width, height, x, y, cut_W, cut_H, show_W, show_H){ var scaleX = show_W / (cut_W * this .ratio || 1); var scaleY = show_H / (cut_H * this .ratio || 1); $( '#' +id).css({ Math.round(scaleX * width * this .ratio) + 'px' , height: Math.round(scaleY * height * this .ratio) + 'px' , marginLeft: '-' + Math.round(scaleX * x * this .ratio) + 'px' , marginTop: '-' + Math.round(scaleY * y * this .ratio) + 'px' }); }, setCutParams: function (x, y, width, height){ $( '#head_x' ).val(Math.round(x * this .ratio)); $( '#head_y' ).val(Math.round(y * this .ratio)); $( '#head_width' ).val(Math.round(width * this .ratio)); $( '#head_height' ).val(Math.round(height * this .ratio)); } }; function cancelHead(){ // window.location.reload(); $( 'img#user_head_origin' ).imgAreaSelect({ remove: true }); $( "#user_head_show_box" ).hide(); $( "#user_head_upload_box" ).show(); $( "#user_head_origin" ).attr({ "src" : "/Content/img/upload.png" , "width" : "100%" , "height" : "100%" }); var path = $( "img#origin_user_head_75" ).attr( "src" ); var index = path.lastIndexOf( "/" ); if (index!=-1){ var name = path.substring(index+1); $( "#user_head_25" ).attr( "src" , "/headphone/25/" +name).css({ 25 + 'px' , height: 25 + 'px' , marginLeft: 0, marginTop: 0 }); $( "#user_head_50" ).attr( "src" , "/headphone/50/" + name).css({ 50 + 'px' , height: 50 + 'px' , marginLeft: 0, marginTop: 0 }); $( "#user_head_75" ).attr( "src" , "/headphone/75/" + name).css({ 75 + 'px' , height: 75 + 'px' , marginLeft: 0, marginTop: 0 }); $( "#user_head_180" ).attr( "src" , "/headphone/180/" + name).css({ 180 + 'px' , height: 180 + 'px' , marginLeft: 0, marginTop: 0 }); } }
下载地址:
CSDN: http://download.csdn.net/download/zengzhan/5109105
BAIDU share: http://pan.baidu.com/share/link?shareid=389586&uk=2735096069
更多关于多种文件上传,分类到这里 http://www.cnblogs.com/zengxiangzhan/category/269831.html
作者: 曾祥展
出处: 学无止境-博客园
声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
分类: 文件上传
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did46698