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}:
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
클린 아키텍처의 Presenter를 이해하기 어려운 것은 MVC 2가 아니기 때문에클린 아키텍처에는 구체적인 클래스 구성 예를 보여주는 다음 그림이 있습니다. 이 그림 중에서 Presenter와 Output Boundary(Presenter의 인터페이스)만 구체 구현을 이미지하는 것이 매우 어렵다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.