آموزش تغییر اندازه و فشرده سازی تصاویر در MVC 5
تغییر اندازه و فشرده سازی تصاویر در MVC 5
در این پست قصد داریم تا نحوه کار با تصاویر و فشرده سازی تصاویر را Asp.Net MVC 5 مورد بررسی قرار دهیم.
در بعضی مواقع شما نیاز دارید تا تصاویری که در سایت آپلود می کنید تغییر اندازه دهید، طول یا عرض تصاویر را کم و زیاد کنید و یا حجم آنها را کاهش دهید.
برای شروع یک کلاس به نام ImagesHelper ایجاد کنید و کدهای زیر را به آن اضافه کنید.
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Globalization; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; public static class ImagesHelper { public enum ImageComperssion { Maximum = 50, Good = 60, Normal = 70, Fast = 80, Minimum = 90, } public static void ResizeImage(this Stream inputStream, int width, int height, string savePath, ImageComperssion ic = ImageComperssion.Normal) { System.Drawing.Image img = new Bitmap(inputStream); System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb); using (Graphics g = Graphics.FromImage(result)) { g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.DrawImage(img, 0, 0, width, height); } result.CompressImage(savePath, ic); } public static void ResizeImage(this System.Drawing.Image img, int width, int height, string savePath, ImageComperssion ic = ImageComperssion.Normal) { System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb); using (Graphics g = Graphics.FromImage(result)) { g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.DrawImage(img, 0, 0, width, height); } result.CompressImage(savePath, ic); } public static void ResizeImageByWidth(this Stream inputStream, int width, string savePath, ImageComperssion ic = ImageComperssion.Normal) { System.Drawing.Image img = new Bitmap(inputStream); int height = img.Height * width / img.Width; System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb); using (Graphics g = Graphics.FromImage(result)) { g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.DrawImage(img, 0, 0, width, height); } result.CompressImage(savePath, ic); } public static void ResizeImageByWidth(this System.Drawing.Image img, int width, string savePath, ImageComperssion ic = ImageComperssion.Normal) { int height = img.Height * width / img.Width; System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb); using (Graphics g = Graphics.FromImage(result)) { g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.DrawImage(img, 0, 0, width, height); } result.CompressImage(savePath, ic); } public static void ResizeImageByHeight(this Stream inputStream, int height, string savePath, ImageComperssion ic = ImageComperssion.Normal) { System.Drawing.Image img = new Bitmap(inputStream); int width = img.Width * height / img.Height; System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb); using (Graphics g = Graphics.FromImage(result)) { g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.DrawImage(img, 0, 0, width, height); } result.CompressImage(savePath, ic); } public static void ResizeImageByHeight(this System.Drawing.Image img, int height, string savePath, ImageComperssion ic = ImageComperssion.Normal) { int width = img.Width * height / img.Height; System.Drawing.Image result = new Bitmap(width, height, PixelFormat.Format24bppRgb); using (Graphics g = Graphics.FromImage(result)) { g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.DrawImage(img, 0, 0, width, height); } result.CompressImage(savePath, ic); } public static void CompressImage(this System.Drawing.Image img, string path, ImageComperssion ic) { System.Drawing.Imaging.EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Convert.ToInt32(ic)); ImageFormat format = img.RawFormat; ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.FormatID == format.Guid); string mimeType = codec == null ? "image/jpeg" : codec.MimeType; ImageCodecInfo jpegCodec = null; ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); for (int i = 0; i < codecs.Length; i++) { if (codecs[i].MimeType == mimeType) { jpegCodec = codecs[i]; break; } } EncoderParameters encoderParams = new EncoderParameters(1); encoderParams.Param[0] = qualityParam; img.Save(path, jpegCodec, encoderParams); } }
متدهای کلاس ImagesHelper
کلاس فوق 5 متد و یک enum دارد که درصد فشرده سازی را مشخص می کند.
متد ResizeImage
این متد یک تصویر ، طول و عرض تصویر ، مسیر آپلود تصویر و نوع فشرده سازی تصویر را دریافت و تصویر را آپلود می کند.
متد ResizeImageByWidth
این متد یک تصویر ، فقط عرض تصویر ، مسیر آپلود تصویر و نوع فشرده سازی تصویر را دریافت و تصویر را آپلود می کند.
متد ResizeImageByHeight
این متد یک تصویر ، فقط طول تصویر ، مسیر آپلود تصویر و نوع فشرده سازی تصویر را دریافت و تصویر را آپلود می کند.
متد CompressImage
این متد یک تصویر ، مسیر آپلود تصویر و نوع فشرده سازی تصویر را دریافت و تصویر را آپلود می کند.
نحوه کار با متدهای کلاس ImagesHelper
ابتدا یک ActionResult با هر نامی که مد نظر دارید ایجاد کنید.(ما همان Index را درنظر گرفتیم)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace ResizeImage.Controllers { public class HomeController : Controller { [HttpGet] public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(HttpPostedFileBase image) { string path = Server.MapPath("~/Images/" + image.FileName); image.InputStream.ResizeImage(250, 200, path, ImagesHelper.ImageComperssion.Normal); Response.Write("<script language='javascript'>alert('تصویر با موفقیت آپلود شد')</script"); return View(); } } }
زمانی که اطلاعات به سمت سرور ارسال می شود ActionResult با نوع پست اجرا می شود.
ابتدا از HttpPostedFileBase یک نمونه به نام image ساختیم که هم نام با نامی است که در View مورد نظر برای تگ آپلود در نظر گرفتیم.
ابتدا مسیر آپلود تصویر و نام تصویر را در متغیری به نام path قرار می دهیم.
چون در متدهای کلاس ImagesHelper برای دریافت تصویر از کلمه کلیدی this استفاده کردیم. پس با نوشته کلمه image می توان به متدهای کلاس ImagesHelper دسترسی داشت و سپس ورودی های متد فوق را وارد کرد. یعنی image را به عنوان تصویر ارسالی در نظر میگیرد.
View اکشن ریزالت Index
@{ ViewBag.Title = "Index"; } @using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @enctype = "multipart/form-data" })) { @Html.AntiForgeryToken() @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <input type="file" id="image" name="image"/> <input type="submit" value="ثبت" class="btn btn-default" /> }
در ویو فوق فقط یک دکمه و تگ فایل آپلود را قرار داده ایم و همچنین enctype برابر multipart/form data قرار داده ایم تا بتوانیم یک فایل یا تصویر به سرور ارسال کنیم.
نظر / سوال