اگر thumbها به درستی نمایش داده نمیشود و فقط قسمتی از عکس رو مشاهده میکنید ، با استفاده از قطعه کد زیر این مشکل رفع خواهد شد :
1- تعریف کلاس به صورت زیر
public class ImageSize
{
public int Height
{
get;
set;
}
public int Width
{
get;
set;
}
}
2- تعریف کلاس ImageResizer همانند زیر :
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);
}