/// <summary> /// 生成缩略图 /// </summary> /// <param name="fileName">源图路径(绝对路径)</param> /// <param name="newFileName">缩略图路径(绝对路径)</param> /// <param name="width">缩略图宽度</param> /// <param name="height">缩略图高度</param> /// <param name="mode">生成缩略图的方式</param> public static void MakeThumbnailImage(string fileName, string newFileName, int width, int height, string mode) // 此方法需要重构 UNDO { //Image originalImage = Image.FromFile(fileName); byte[] imageBytes = SFTPFactory.CreateSFTPHelper().RecieveStream(fileName); Image originalImage = Image.FromStream(new System.IO.MemoryStream(imageBytes)); int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (mode) { case "HW"://指定高宽缩放(可能变形) break; case "W"://指定宽,高按比例 toheight = originalImage.Height * width / originalImage.Width; break; case "H"://指定高,宽按比例 towidth = originalImage.Width * height / originalImage.Height; break; case "Cut"://指定高宽裁减(不变形) if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight) { oh = originalImage.Height; ow = originalImage.Height * towidth / toheight; y = 0; x = (originalImage.Width - ow) / 2; } else { ow = originalImage.Width; oh = originalImage.Width * height / towidth; x = 0; y = (originalImage.Height - oh) / 2; } break; default: break; } //新建一个bmp图片 Bitmap b = new Bitmap(towidth, toheight); try { //新建一个画板 Graphics g = Graphics.FromImage(b); //设置高质量插值法 g.InterpolationMode = InterpolationMode.HighQualityBicubic; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = SmoothingMode.AntiAlias; g.PixelOffsetMode = PixelOffsetMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel); // 将图片转换为流 Stream ms = new MemoryStream(); b.Save(ms, ImageFormat.Jpeg); string workingDirectory = newFileName.Substring(0, newFileName.LastIndexOf("/") + 1); string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string imgPath = path + newFileName.Substring(newFileName.LastIndexOf("/")); b.Save(imgPath); SFTPFactory factory = new SFTPFactory(); factory.InitFSTPClient(workingDirectory); SFTPFactory.CreateSFTPHelper().Save(ms, newFileName); //SaveImage(b, newFileName, GetCodecInfo("image/" + GetFormat(newFileName).ToString().ToLower())); } catch (System.Exception e) { throw e; } finally { originalImage.Dispose(); b.Dispose(); } }
/// <summary> /// 制作缩略图 /// </summary> /// <param name="original">图片对象</param> /// <param name="newFileName">新图路径</param> /// <param name="maxWidth">最大宽度</param> /// <param name="maxHeight">最大高度</param> public static void MakeThumbnailImage(Image original, string newFileName, int maxWidth, int maxHeight) { Size _newSize = ResizeImage(original.Width, original.Height, maxWidth, maxHeight); string path = HttpContext.Current.Server.MapPath("/uploadsTest/"); if (!File.Exists(path)) { Directory.CreateDirectory(path); } //original.Save(Path.Combine(path,new Random(1000).Next()+".jpg")); // UNDO: using (Image displayImage = new Bitmap(original, _newSize)) { try { SFTPFactory facotry = new SFTPFactory(); string directory = newFileName.Substring(0, newFileName.LastIndexOf(@"/")); facotry.InitFSTPClient(directory); // 将图片装换成流 byte[] imageBytes = SFTPFactory.CreateSFTPHelper().RecieveStream(newFileName); Stream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); displayImage.Save(ms, original.RawFormat); displayImage.Save(Path.Combine(path, new Random().Next() + ".Png")); //SFTPFactory.SFTPHelper.client.Delete(newFileName); SFTPFactory.CreateSFTPHelper().Save(ms, newFileName); } finally { original.Dispose(); } } }
/// <summary> /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸 2015年12月14日 【MF】 /// </summary> /// <param name="postedFile">上传的图片流</param> /// <param name="filePath">文件保存路径</param> /// <param name="maxWidth">最大宽(单位:px)</param> /// <param name="maxHeight">最大高(单位:px)</param> public static string MakeThumbnailImage(System.Web.HttpPostedFile postedFile, string fileSaveUrl, int maxWidth, int maxHeight) { // 1.0 从文件获取原始图片, 并使用流中嵌入的颜色管理信息 Image originalImage = Image.FromStream(postedFile.InputStream, true); string imgExt = Common.GetFileExt(postedFile.FileName); string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + "." + imgExt; ; double destWidth, destHeight; try { // 1.1 初始化 SFTP 协议内容 SFTPFactory factory = new SFTPFactory(); factory.InitFSTPClient(fileSaveUrl); SFTPHelper sftpHelper = SFTPFactory.CreateSFTPHelper(); double templateRate = (double)maxWidth / (double)maxHeight; // 模板的宽高比例 double originalRate = (double)originalImage.Width / (double)originalImage.Height; // 原始图片宽高比 // 2.0 原图宽高均小于模板,不作处理,直接保存 if (originalImage.Width <= maxWidth && originalImage.Height <= maxHeight) { destWidth = originalImage.Width; destHeight = originalImage.Height; } if (originalRate > templateRate) { double zoom = (double)maxWidth / (double)originalImage.Width; destHeight = originalImage.Height * zoom; destWidth = maxWidth; } else { double zoom = (double)maxHeight / (double)originalImage.Height; destWidth = originalImage.Width * zoom; destHeight = maxHeight; } Image img = new Bitmap(maxWidth, maxHeight); Graphics graphics = Graphics.FromImage(img); graphics.InterpolationMode = InterpolationMode.High; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.Clear(Color.White); graphics.DrawImage(originalImage, new Rectangle(0, 0, (int)destWidth, (int)destHeight), new Rectangle(0, 0, originalImage.Width, originalImage.Height), GraphicsUnit.Pixel); MemoryStream ms = new MemoryStream(); byte[] myImage = null; img.Save(ms, ImageFormat.Jpeg); myImage = ms.GetBuffer(); MemoryStream newMs = new MemoryStream(myImage, 0, myImage.Length, true, true); sftpHelper.Save(newMs, fileSaveUrl + fileName); } catch (Exception ex) { throw new Exception(ex.Message); } return fileName; }
/// <summary> /// 文件上传方法C /// </summary> /// <param name="postedFile">文件流</param> /// <param name="isThumbnail">是否生成缩略图</param> /// <param name="isWater">是否打水印</param> /// <param name="isReOriginal">是否返回文件原名称</param> /// <returns>服务器文件路径</returns> public string FileSaveAs(HttpPostedFile postedFile, bool isThumbnail, bool isWater, bool _isImage, bool _isReOriginal) { try { string fileExt = Common.GetFileExt(postedFile.FileName); //文件扩展名,不含“.” string originalFileName = postedFile.FileName.Substring(postedFile.FileName.LastIndexOf(@"\") + 1); //取得文件原名 string fileName = Common.GetRamCode() + "." + fileExt; //随机文件名 string dirPath = GetUpLoadPath(); //上传目录相对路径 //检查文件扩展名是否合法 if (!CheckFileExt(fileExt)) { return "不允许上传" + fileExt + "类型的文件!"; } //检查是否必须上传图片 if (_isImage && !IsImage(fileExt)) { return "对不起,仅允许上传图片文件!"; } //检查文件大小是否合法 if (!CheckFileSize(fileExt, postedFile.ContentLength)) { return "文件超过限制的大小啦!"; } // 获取图片服务器的地址 var picPath = "http://pic.myqwe.com/" + this.siteConfig.attachpath + "/" + fileName; // string workingDirectory = "/data/web/userpic/Uploads/" + userId + "LogoAndBanner" + "/"; string workingDirectory = GetUpLoadPath(); SFTPFactory factory = new SFTPFactory(); factory.InitFSTPClient(workingDirectory); //获得要保存的文件路径 string serverFileName = Path.Combine(workingDirectory, fileName); string serverThumbnailFileName = Path.Combine(workingDirectory, "thumb/" + fileName); //workingDirectory + "small_" + fileName; string returnFileName = serverFileName; //Stream stream = new MemoryStream(); //postedFile.InputStream.CopyTo(stream,postedFile.ContentLength); //var temp = postedFile.InputStream; //保存文件 postedFile.SaveAs(toFileFullPath + fileName); SFTPFactory.CreateSFTPHelper().Save(postedFile.InputStream, serverFileName); //Image img = Image.FromStream(new System.IO.MemoryStream(postedFile.InputStream)); //如果是图片,检查图片尺寸是否超出限制 UNDO if (IsImage(fileExt) && (this.siteConfig.attachimgmaxheight > 0 || this.siteConfig.attachimgmaxwidth > 0)) { //Thumbnail.MakeThumbnailImage(serverFileName, serverFileName, this.siteConfig.attachimgmaxwidth, this.siteConfig.attachimgmaxheight); } //是否生成缩略图 if (IsImage(fileExt) && isThumbnail && this.siteConfig.thumbnailwidth > 0 && this.siteConfig.thumbnailheight > 0) { Thumbnail.MakeThumbnailImage(serverFileName, serverThumbnailFileName, this.siteConfig.thumbnailwidth, this.siteConfig.thumbnailheight, "Cut"); returnFileName += "," + serverThumbnailFileName; //返回缩略图,以逗号分隔开 } //是否打图片水印 if (IsWaterMark(fileExt) && isWater) { switch (this.siteConfig.watermarktype) { case 1: WaterMark.AddImageSignText(serverFileName, serverFileName, this.siteConfig.watermarktext, this.siteConfig.watermarkposition, this.siteConfig.watermarkimgquality, this.siteConfig.watermarkfont, this.siteConfig.watermarkfontsize); break; case 2: WaterMark.AddImageSignPic(serverFileName, serverFileName, this.siteConfig.watermarkpic, this.siteConfig.watermarkposition, this.siteConfig.watermarkimgquality, this.siteConfig.watermarktransparency); break; } } //如果需要返回原文件名 if (_isReOriginal) { return serverFileName + "-------------" + originalFileName; } return picPath; } catch (Exception ex) { throw new Exception(ex.Message); } }