اکستنشن بالا فقط برای ذخیره عکس هست بدون ساخت thumbnail
این نسخه شامل موارد زیر هست :
| ✅ ذخیره عکس اصلی به صورت WebP |
| ✅ در صورت وجود نداشتن پوشه ، پوشه رو خودش میسازه------------------------------------------------------------------(خودکار) |
| ✅ ساخت Thumbnail--------------------------------------------------------------------------------------------------------( در صورت نیاز ) |
| ✅ ساخت نسخه فوق سبک عکس در حد چند بایت (برای لود اولیه سایت به صورت بلوری)-------------( در صورت نیاز ) |
| ✅ پردازش و ساخت تصاویر به صورت Async و همزمان------------(افزایش سرعت تا 5 برابر ذخیره عکس / عکس ها) |
| ✅ نسخه کاملا بهینه و سبک |
public static class ImageExtensions
{
/// <summary>
/// Thumbnail و LQIP و در صورت نیاز
/// WebP ذخیرهسازی تصویر به صورت
///"wwwroot/example/*****/*****"
///: مسیر ورودی باید به شکل زیر باشد
/// </summary>
public static async Task<string> SaveAsWebpAsync(
this IFormFile? file,
string path,
bool makeThumbnail = false,
bool makeLqip = false)
{
if (file == null)
return "no-image.png";
if (!path.StartsWith("wwwroot"))
throw new Exception("مسیر باید با 'wwwroot/' شروع شود.");
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
var imageName = NameGenarator.GenerateUniqName() + ".webp";
var savePath = Path.Combine(Directory.GetCurrentDirectory(), path, imageName);
byte[] imageBytes;
using (var ms = new MemoryStream())
{
await file.CopyToAsync(ms);
imageBytes = ms.ToArray();
}
// تصویر اصلی
using (var image = new MagickImage(imageBytes))
{
image.AutoOrient();
image.Format = MagickFormat.WebP;
image.Quality = 60;
image.Settings.SetDefine(MagickFormat.WebP, "method", "4");
image.Settings.SetDefine(MagickFormat.WebP, "lossless", "false");
if (image.Width > 1600 || image.Height > 1600)
{
image.Resize(new MagickGeometry(1600, 1600)
{
IgnoreAspectRatio = false
});
}
await image.WriteAsync(savePath);
}
var tasks = new List<Task>();
// Thumbnail
if (makeThumbnail)
{
tasks.Add(Task.Run(async () =>
{
var thumbFolder = Path.Combine(path, "thumbnails");
if (!Directory.Exists(thumbFolder))
Directory.CreateDirectory(thumbFolder);
var thumbPath = Path.Combine(Directory.GetCurrentDirectory(), thumbFolder, imageName);
using var thumb = new MagickImage(imageBytes);
thumb.AutoOrient();
thumb.Format = MagickFormat.WebP;
thumb.Resize(new MagickGeometry(300, 300)
{
IgnoreAspectRatio = false
});
await thumb.WriteAsync(thumbPath);
}));
}
// LQIP
if (makeLqip)
{
tasks.Add(Task.Run(async () =>
{
var lqipFolder = Path.Combine(path, "lqip");
if (!Directory.Exists(lqipFolder))
Directory.CreateDirectory(lqipFolder);
var lqipPath = Path.Combine(Directory.GetCurrentDirectory(), lqipFolder, imageName);
using var lqip = new MagickImage(imageBytes);
lqip.AutoOrient();
lqip.Format = MagickFormat.WebP;
lqip.Resize(new MagickGeometry(40, 40)
{
IgnoreAspectRatio = false
});
lqip.Quality = 20;
await lqip.WriteAsync(lqipPath);
}));
}
if (tasks.Any())
await Task.WhenAll(tasks);
return imageName;
}
}
طرز استفاده👇 :
model.LogoName = await model.Logo.SaveAsWebpAsync("wwwroot/theme-assets/images/supplierLogo/",true,true);
🔥💥اگه نیاز به Thumbnail یا نسخه فوق سبک تر داشتید میتونید ورودی ها رو Ture بزارید اگه هم نزارید ساخته نمیشه .