Asp.net mvc 실시 간 으로 축 률 도 를 하 드 디스크 에 생 성 합 니 다.

축 률 도 에 대한 처 리 는 이미지 가 서버 에 올 라 간 후에 두 장의 서로 다른 사이즈 의 축 률 을 동시에 생 성하 여 전단 호출 을 제공 하 는 것 이다.처음에는 수 요 를 만족 시 킬 수 있 었 고 전단 전시 가 다양 해 지면 서 축 률 도 는 전단 전시 수 요 를 만족 시 킬 수 없 었 기 때문에 실시 간 으로 이미지 축 률 도 서 비 스 를 만 드 는 것 을 고려 했다.
매번 실시 간 으로 축 률 도 를 생 성 할 때마다 캐 시 하지 않 는 것 은 낭비 하기 때문에 축 률 을 생 성 하 는 동시에 하 드 디스크 에 캐 시 하면 효율 이 많이 향상 된다.
전에 인터넷 에서 누군가가 nginx+lua 로 이 루어 진 것 을 보 았 습 니 다.효율 은 할 말 이 없 지만 시간 이 촉박 하고 자신 도 연구 할 시간 이 없 기 때문에 잠시 aps.net mvc 4 로 하 나 를 실현 하고 나중에 시간 이 있 으 면 천천히 수정 하 겠 습 니 다.
자신 이 잘 아 는.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}:대상 그림 주소
{Thum Mode}:1:지정 높이 비례,2:지정 너비,높이 비례,3:지정 높이 감소(변형 되 지 않 음)
{Width}:그림 너비
{Height}:
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기