اگر thumbها به درستی نمایش داده نمیشود و فقط قسمتی از عکس رو مشاهده میکنید ، با استفاده از قطعه کد زیر این مشکل رفع خواهد شد :
1- تعریف کلاس به صورت زیر
2- تعریف کلاس ImageResizer همانند زیر :
3- تعریف کلاس ThumbnailCreator همانند نمونه زیر :
4- تعریف اکشن Thumbnail همانند زیر :
و در پایان اکشن GetThumbnail را همانند زیر تغییر خواهیم داد :
1- تعریف کلاس به صورت زیر
public class ImageSize { public int Height { get; set; } public int Width { get; set; } }
public class ImageResizer { public ImageSize Resize(ImageSize originalSize, ImageSize targetSize) { var aspectRatio = (float)originalSize.Width / (float)originalSize.Height; var width = targetSize.Width; var height = targetSize.Height; if (originalSize.Width > targetSize.Width || originalSize.Height > targetSize.Height) { if (aspectRatio > 1) { height = (int)(targetSize.Height / aspectRatio); } else { width = (int)(targetSize.Width * aspectRatio); } } else { width = originalSize.Width; height = originalSize.Height; } return new ImageSize { Width = Math.Max(width, 1), Height = Math.Max(height, 1) }; } }
3- تعریف کلاس ThumbnailCreator همانند نمونه زیر :
public class ThumbnailCreator { private static readonly IDictionary<string, ImageFormat> ImageFormats = new Dictionary<string, ImageFormat>{ {"image/png", ImageFormat.Png}, {"image/gif", ImageFormat.Gif}, {"image/jpeg", ImageFormat.Jpeg} }; private readonly ImageResizer resizer; public ThumbnailCreator() { this.resizer = new ImageResizer(); } public byte[] Create(Stream source, ImageSize desiredSize, string contentType) { using (var image = Image.FromStream(source)) { var originalSize = new ImageSize { Height = image.Height, Width = image.Width }; var size = resizer.Resize(originalSize, desiredSize); using (var thumbnail = new Bitmap(size.Width, size.Height)) { ScaleImage(image, thumbnail); using (var memoryStream = new MemoryStream()) { thumbnail.Save(memoryStream, ImageFormats[contentType]); return memoryStream.ToArray(); } } } } private void ScaleImage(Image source, Image destination) { using (var graphics = Graphics.FromImage(destination)) { graphics.CompositingMode = CompositingMode.SourceCopy; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.DrawImage(source, 0, 0, destination.Width, destination.Height); } } }
4- تعریف اکشن Thumbnail همانند زیر :
private FileContentResult CreateThumbnail(string physicalPath) { using (var fileStream = System.IO.File.OpenRead(physicalPath)) { var desiredSize = new ImageSize { Width = ThumbnailWidth, Height = ThumbnailHeight }; string contentType = MimeMapping.GetMimeMapping(physicalPath); return File(thumbnailCreator.Create(fileStream, desiredSize, contentType), contentType); } }
و در پایان اکشن GetThumbnail را همانند زیر تغییر خواهیم داد :
public virtual ActionResult GetThumbnail(string path) { path = GetSafeFileAndDirPath(path); // return File(path, contentType); return CreateThumbnail(path); }