• 1405/06/29

نسخه Thumbnail ساز اکستنشن قبلی ⚡ :

https://toplearn.com/q/94019

اکستنشن بالا فقط برای ذخیره عکس هست بدون ساخت 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 بزارید اگه هم نزارید ساخته نمیشه .