亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

Asp.net mvc實時生成縮率圖到硬盤

2024-07-10 13:30:26
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Asp.net mvc實時生成縮率圖到硬盤的相關資料,需要的朋友可以參考下
 

對于縮率圖的處理是在圖片上傳到服務器之后,同步生成兩張不同尺寸的縮率供前端調用,剛開始還能滿足需求,慢慢的隨著前端展示的多樣化,縮率圖已不能前端展示的需求,所以考慮做一個實時生成圖片縮率圖服務。

每次調用實時生成縮率圖,不緩存著實有點浪費,所以在生成縮率的同時緩存到硬盤一份,效率提高很多。

之前從網上看了一下有人用nginx + lua實現的,效率那是沒什么可說的,但是時間緊迫,自己也沒時間去研究,所以暫時先用aps.net mvc4來實現 一個,以后有時間了,再慢慢修改。

用自己熟悉的.net性能可能差那么一點點,但是實現速度快,保證可以在極端的時間內上線,并且在功能上更強。

思路很簡單,就是根據請求,判斷需要的縮率圖是否已存在于硬盤上,如果有直接返回,沒有則下載原圖,并生成縮率圖到本地,返回給客戶端。

下面直接粘貼代碼片段:

/// <summary> /// 生成圖片縮率圖Action /// </summary> /// <param name="p">原圖url</param> /// <param name="id">圖片尺寸以及生成縮率圖的類型</param> /// <returns></returns> [ValidateInput(false)] public ActionResult Index(string p, string id) {  if (string.IsNullOrEmpty(p))  {  return new HttpStatusCodeResult(404);  }  string oPath = Regex.Replace(p, @"http[s]?://(.*?)/", "/", RegexOptions.IgnoreCase);  int? oWidth = 200, oHeight = 200;  int cutMode = 3;  string pPath;  string oDir;  if (!string.IsNullOrEmpty(id))  {  string[] ss = id.Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries);  if (ss.Length < 2)  {   return new HttpStatusCodeResult(404);  }  if (ss.Length > 2)  {   cutMode = int.Parse(ss[2]);  }  oPath = oPath.Insert(oPath.LastIndexOf('/') + 1, string.Format("{0}_{1}_{2}_", ss[0], ss[1], cutMode));  oWidth = int.Parse(ss[0]);  oHeight = int.Parse(ss[1]);  }  pPath = Server.MapPath(oPath);  oDir = Path.GetDirectoryName(pPath);  if (!System.IO.File.Exists(pPath))  {  byte[] imagebytes = FileHelper.DownLoadFile(p);  if (!Directory.Exists(oDir))  {   Directory.CreateDirectory(oDir);  }  FileHelper.MakeThumbnail(FileHelper.BytToImg(imagebytes), oWidth.Value, oHeight.Value, (ThumbnailMode)cutMode, pPath, true);  }  return File(pPath, FileHelper.GetContentTypeByExtension(Path.GetExtension(pPath).ToLower())); }

輔助方法:

 public class FileHelper {  /// <summary> /// 圖片后綴和ContentType對應字典 /// </summary> static Dictionary<string, string> extensionContentTypeDic; static FileHelper() {  if (extensionContentTypeDic == null)  {  //.jpg", ".png", ".gif", ".jpeg  extensionContentTypeDic = new Dictionary<string, string>();  extensionContentTypeDic.Add(".jpg", "image/jpeg");  extensionContentTypeDic.Add(".png", "image/png");  extensionContentTypeDic.Add(".gif", "image/gif");  extensionContentTypeDic.Add(".jpeg", "image/jpeg");  } } /// <summary> /// 根據后綴名獲取extension /// </summary> /// <param name="extension"></param> /// <returns></returns> public static string GetContentTypeByExtension(string extension) {  if (extensionContentTypeDic.ContainsKey(extension))  {  return extensionContentTypeDic[extension];  }  return null; } /// <summary >  /// 將Image對象轉化成二進制流  /// </summary >  /// <param name="image" > </param >  /// <returns > </returns >  public static byte[] ImageToByteArray(Image image) {  MemoryStream imageStream = new MemoryStream();  Bitmap bmp = new Bitmap(image.Width, image.Height);  Graphics g = Graphics.FromImage(bmp);  g.DrawImage(image, new System.Drawing.Rectangle(0, 0, image.Width, image.Height));  try  {  bmp.Save(imageStream, image.RawFormat);  }  catch (Exception e)  {  bmp.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg);  }  byte[] byteImg = imageStream.GetBuffer();  bmp.Dispose();  g.Dispose();  imageStream.Close();  return byteImg; } /// <summary>  /// 字節流轉換成圖片  /// </summary>  /// <param name="byt">要轉換的字節流</param>  /// <returns>轉換得到的Image對象</returns>  public static Image BytToImg(byte[] byt) {  MemoryStream ms = new MemoryStream(byt);  Image img = Image.FromStream(ms);  ms.Close();  return img; } /// <summary> /// 生成縮率圖 /// </summary> /// <param name="originalImage">原始圖片Image</param> /// <param name="width">縮率圖寬</param> /// <param name="height">縮率圖高</param> /// <param name="mode">生成縮率圖的方式</param> /// <param name="thumbnailPath">縮率圖存放的地址</param> public static Image MakeThumbnail(Image originalImage, int width, int height, ThumbnailMode mode, string thumbnailPath, bool isSave = true) {  int towidth = width;  int toheight = height;  int x = 0;  int y = 0;  int ow = originalImage.Width;  int oh = originalImage.Height;  switch (mode)  {  case ThumbnailMode.HW://指定高寬縮放(可能變形)      break;  case ThumbnailMode.W://指定寬,高按比例      toheight = originalImage.Height * width / originalImage.Width;   break;  case ThumbnailMode.H://指定高,寬按比例    towidth = originalImage.Width * height / originalImage.Height;   break;  case ThumbnailMode.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圖片   System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);  //新建一個畫板   Graphics g = System.Drawing.Graphics.FromImage(bitmap);  //設置高質量插值法   g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;  //設置高質量,低速度呈現平滑程度   g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;  //清空畫布并以透明背景色填充   g.Clear(Color.Transparent);  //在指定位置并且按指定大小繪制原圖片的指定部分   g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),  new Rectangle(x, y, ow, oh),  GraphicsUnit.Pixel);  if (!isSave)  {  return bitmap;  }  try  {  //以jpg格式保存縮略圖   //bitmap.Save(thumbnailPath, bitmap.RawFormat);  bitmap.Save(thumbnailPath, ImageFormat.Jpeg);  return bitmap;  }  catch (System.Exception e)  {  throw e;  }  finally  {  originalImage.Dispose();  bitmap.Dispose();  g.Dispose();  }  return null; } /// <summary> /// 下載指定文件 /// </summary> /// <param name="remoteUrl"></param> /// <param name="ss"></param> public static byte[] DownLoadFile(string remoteUrl) {  WebClient wc = new WebClient();  try  {  return wc.DownloadData(remoteUrl);  }  catch (Exception e)  {  throw new Exception("下載文件失敗");  } } } public enum ThumbnailMode { /// <summary> /// 指定高寬縮放(可能變形) /// </summary> HW, /// <summary> /// 指定高,寬按比例 /// </summary> H, /// <summary> /// 指定寬,高按比例 /// </summary> W, /// <summary> /// 指定高寬裁減(不變形)  /// </summary> Cut, }

訪問方式:

http://www.souji8.com/Home/Index/{width}_{height}_{ThumMode}?p={imageUrl}

{imageUrl}:目標圖片地址

{ThumMode}: 1:指定高寬按比例、2:指定寬,高按比例、3:指定高寬裁減(不變形)

{Width}:期望圖片寬

{Height}:期望圖片高

以上就是本文的全部內容,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂男人的天堂| 国产亚洲精品一区二555| 中文字幕欧美日韩va免费视频| 欧美国产日韩精品| 精品国内亚洲在观看18黄| 亚洲a级在线观看| 91青草视频久久| 亚洲第一中文字幕| 欧美在线性视频| 久久99国产综合精品女同| 久久99久久亚洲国产| 成人h片在线播放免费网站| 国产精品第1页| 国产精品白嫩初高中害羞小美女| 亚洲免费高清视频| 中文字幕亚洲无线码a| 日韩电影在线观看永久视频免费网站| 亚洲综合中文字幕在线观看| 日韩小视频在线观看| 亚洲人在线观看| 久久免费视频这里只有精品| 精品国模在线视频| 美日韩精品视频免费看| 精品亚洲一区二区| 日韩免费高清在线观看| 日本欧美精品在线| 精品久久久久久久久久久久久| 国产综合久久久久| 97超视频免费观看| 国产91精品黑色丝袜高跟鞋| 日日噜噜噜夜夜爽亚洲精品| 国产精品第七影院| 久久色精品视频| 高清一区二区三区四区五区| 欧美成人一区在线| 色妞一区二区三区| 国产精品自在线| 亚洲最新av在线网站| 日韩中文在线中文网三级| 亚洲精美色品网站| 欧美激情第一页xxx| 久久久久久久久电影| 91av视频导航| 久久久免费精品| 久久久久久久久久久免费| 国产精品久久久久不卡| 国产精品永久免费视频| 亚洲男人天堂2023| 久久久av电影| 日韩久久精品成人| 亚洲欧美国产制服动漫| 欧日韩不卡在线视频| 亚洲女人被黑人巨大进入al| 国产精品999999| 国产精品视频资源| 国产精品视频999| 91美女高潮出水| 成人免费福利在线| 欧美性猛交丰臀xxxxx网站| 亚洲a在线观看| 欧美一区二区三区……| 日韩中文在线视频| 久久久久久成人精品| 亚洲精品一区av在线播放| 在线观看国产成人av片| 精品激情国产视频| 538国产精品一区二区在线| 在线免费观看羞羞视频一区二区| 久久精彩免费视频| 欧美日韩国产区| 国产精品久久久久久久久久久不卡| 久久99精品国产99久久6尤物| 亚洲资源在线看| 97视频网站入口| 国产成人精彩在线视频九色| 在线观看不卡av| 国产视频综合在线| 亚洲国产成人精品久久久国产成人一区| 午夜精品www| 91视频8mav| 亚洲男子天堂网| 日本一欧美一欧美一亚洲视频| 国产在线拍偷自揄拍精品| 国产精品久久不能| 欧美激情亚洲视频| 亚洲人成伊人成综合网久久久| 国产精品老牛影院在线观看| 日韩免费中文字幕| 久久亚洲精品一区二区| 亚洲缚视频在线观看| 中文字幕亚洲二区| 亚洲国产欧美一区二区三区同亚洲| 久久免费视频在线| 国模gogo一区二区大胆私拍| 亚洲国产日韩欧美在线图片| 亚洲欧美福利视频| 激情亚洲一区二区三区四区| 日韩电影大全免费观看2023年上| 97婷婷涩涩精品一区| 久久综合伊人77777尤物| 亚洲色图综合久久| 国产成人精品久久二区二区91| 日韩一区二区在线视频| 国产精品久久久久久久久久尿| 久久久免费在线观看| 欧美日韩不卡合集视频| 久久人人爽人人爽人人片av高请| 91亚洲国产成人精品性色| 日韩电影在线观看永久视频免费网站| 青青青国产精品一区二区| 欧美性高潮床叫视频| 亚洲成人久久电影| 亚洲精品久久久久中文字幕二区| 精品国偷自产在线视频| www.日韩av.com| 欧美日韩国产在线看| 91国在线精品国内播放| 亚洲精品福利免费在线观看| 午夜精品免费视频| 欧美大片大片在线播放| 亚洲精品网址在线观看| 日韩小视频网址| 国产女精品视频网站免费| 欧美性猛交xxxx黑人猛交| 色综合久久88色综合天天看泰| 欧美性猛交xxxx免费看漫画| 这里只有精品视频在线| 精品日韩视频在线观看| 欧美日韩国产综合新一区| 亚洲www在线观看| 91亚洲精品在线| 亚洲午夜久久久久久久| 亚洲毛片在线观看| 亚洲欧洲在线免费| 精品国产美女在线| 岛国视频午夜一区免费在线观看| 国产精品视频免费观看www| 在线中文字幕日韩| 亚洲激情久久久| 日韩在线观看免费高清完整版| 欧美激情免费视频| 国产精品九九久久久久久久| 欧美激情第1页| 中文字幕日本精品| 国产精品视频不卡| 亚洲va久久久噜噜噜久久天堂| 热久久视久久精品18亚洲精品| 国产精品久久久久77777| 亚洲人成网站色ww在线| 国产成人在线亚洲欧美| 亲子乱一区二区三区电影| 国产日韩精品在线| 亚洲电影免费观看高清完整版在线观看| 国产热re99久久6国产精品| 国产在线精品成人一区二区三区| 国产成人精品久久亚洲高清不卡| 日本韩国欧美精品大片卡二| 亚洲精品国产电影| 国产91久久婷婷一区二区| 国产主播欧美精品| 亚洲精品美女久久久久| 久久成人精品电影| 国产中文字幕日韩| 超在线视频97|