在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
做站的时候经常会遇到要生成缩略图的功能,因为可能不同的情况需要用来不同大小的缩略图。 本文生成的图片都为正方形,只有正方形的缩略图才是保证图片足够清晰。 当我我这里说的正方形是先按比例压缩,然后加一个固定的白底 然后居中显示。 代码: 新建outputimg.ashx 复制代码 代码如下: //调整图片大小 private static Size NewSize(int maxWidth, int maxHeight, int Width, int Height) { double w = 0.0; double h = 0.0; double sw = Convert.ToDouble(Width); double sh = Convert.ToDouble(Height); double mw = Convert.ToDouble(maxWidth); double mh = Convert.ToDouble(maxHeight); if (sw < mw && sh < mh)//如果maxWidth和maxHeight大于源图像,则缩略图的长和高不变 复制代码 代码如下: //生成缩略图 public static void SendSmallImage(string filename, string newfile, int maxHeight, int maxWidth, string mode) { System.Drawing.Image img = System.Drawing.Image.FromFile(filename);//源图像的信息 System.Drawing.Imaging.ImageFormat thisformat = img.RawFormat; //源图像的格式 Size newSize = NewSize(maxWidth, maxHeight, img.Width, img.Height); //返回调整后的图像Width与Height Bitmap outBmp = new Bitmap(maxWidth, maxHeight); Graphics g = Graphics.FromImage(outBmp); //设置画布的描绘质量 g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.Clear(Color.White); g.DrawImage(img, new Rectangle(((maxWidth - newSize.Width) / 2), ((maxHeight - newSize.Height) / 2), newSize.Width, newSize.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel); g.Dispose(); //以下代码为保存图片时,设置压缩质量 EncoderParameters encoderParams = new EncoderParameters(); long[] quality = new long[1]; quality[0] = 100; EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); encoderParams.Param[0] = encoderParam; //获取包含有关内置图像编码解码器的信息的ImageCodecInfo对象。 ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo jpegICI = null; for (int x = 0; x < arrayICI.Length; x++) { if (arrayICI[x].FormatDescription.Equals("JPEG")) { jpegICI = arrayICI[x];//设置jpeg编码 break; } } if (jpegICI != null) { outBmp.Save(newfile, jpegICI, encoderParams); } else { outBmp.Save(newfile, thisformat); } img.Dispose(); outBmp.Dispose(); } 输出图片: 复制代码 代码如下: //输出图片 public static void OutPutImg(string imgFilePath) { FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(imgFilePath), FileMode.Open, FileAccess.Read); DateTime contentModified = System.IO.File.GetLastWriteTime(HttpContext.Current.Server.MapPath(imgFilePath)); if (IsClientCached(contentModified)) { HttpContext.Current.Response.StatusCode = 304; HttpContext.Current.Response.SuppressContent = true; } else { byte[] mydata = new byte[fs.Length]; int Length = Convert.ToInt32(fs.Length); fs.Read(mydata, 0, Length); fs.Close(); HttpContext.Current.Response.OutputStream.Write(mydata, 0, Length); HttpContext.Current.Response.ContentType = "image/jpeg"; HttpContext.Current.Response.End(); HttpContext.Current.Response.Cache.SetETagFromFileDependencies(); HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(true); HttpContext.Current.Response.Cache.SetLastModified(contentModified); } } 复制代码 代码如下: //outpuimg.ashx?src=/images/weimeidesc/8af30049-797e-4eb4-8a54-cc4de47c1694.jpg!100x100.jpg public void ProcessRequest(HttpContext context) { //获取图片 string imgUrl = context.Request.QueryString["src"]; string trueFilePath = imgUrl.Split('!')[0]; //获取图片大小 int width = Convert.ToInt32(imgUrl.Split('!')[1].Replace(".jpg", "").Split('x')[0]); int height = Convert.ToInt32(imgUrl.Split('!')[1].Replace(".jpg", "").Split('x')[1]); //图片已经存在直接输出 if (File.Exists(context.Server.MapPath("~/" + imgUrl))) { OutPutImg("~/"+imgUrl); } else { if (!string.IsNullOrEmpty(imgUrl) && File.Exists(context.Server.MapPath("~/" + trueFilePath))) { Image originalImage = System.Drawing.Image.FromFile(context.Server.MapPath("~/" + trueFilePath)); var newBitmap = new Bitmap(originalImage); //生成相应的小图并保存 SendSmallImage(context.Server.MapPath("~/" + trueFilePath),context.Server.MapPath("~/" + imgUrl), width, height, "meiyouyisi"); //输出 OutPutImg("~/" + imgUrl); } else//图片如果不存在 输出默认图片 { //OutPutImg(imgUrl); } } } |
请发表评论