从同一来源生成多个图像的最有效方法是什么? C#/ Asp.Net

时间:2019-12-22 01:36:30

标签: c# asp.net-mvc asp.net-core imagesharp

我正在创建一个接受来自IP摄像机的大图像并显示在网站上的应用程序。当前,图像为4K分辨率,大小范围在1MB至3MB之间。

这些图像将显示在图库中。

为此,我只需要两个图像。一个250 x 160的缩略图和一个更大的灯箱图片(我选择了1280 x 720)。但是,对于站点的其他部分,同时获取四个图像可能会更有效。

我目前选择的库是SixLabors.ImageSharp。

问题是,下面的代码是否是一种有效的从一个图像生成图像的方法,而没有内存泄漏或其他陷阱的风险?

此代码最终将被重新编写为AzureFunction(BlobTrigger)。

public async Task GenerateThumbnails(Stream source, ImageSizes[] sizes)
        {
            //Test data
            sizes = new ImageSizes[] { new ImageSizes { Name ="720p", Height=720, Width=1280 },
                                       new ImageSizes { Name ="1080p", Height=1080, Width=1920 },
                                       new ImageSizes { Name ="gallery", Height=160, Width=250 },
                                       new ImageSizes { Name ="thumb", Height=30, Width=30 }};

            List<Task> allTasks = new List<Task>(sizes.Length);

            foreach (var size in sizes)
            {
                allTasks.Add(Task.Run(() =>
                {
                    var outputStream = new MemoryStream();

                    using (Image rawImage = Image.Load(source))
                    {
                        rawImage.Mutate(x => x.Resize(size.Width, size.Height));
                        rawImage.Save(outputStream, new JpegEncoder() { Quality = 40 });                        
                    }

                    using (var fileStream = outputStream)
                    {
                        //Do something here. Upload to Azure Blob / container or save to disk etc...
                        //blob.UploadFromStream(outputStream);
                    }
                }));
            }

            await Task.WhenAll(allTasks);

            //Do something else;
        }

1 个答案:

答案 0 :(得分:0)

我的第一个建议是不要在ASP.Net中进行大量工作。 ASP.Net already has serious memory issues在paralell中每个CPU Core 可能运行100个请求。关于您要做的最后一件事,是在其工作列表中添加更多内容。尤其是像图像处理这样的内存消耗。

我将在ASP.Net中做我需要做的最少工作-主图像和缩略图。其他部分的准备工作?那些可以移到后台进程中。列表中的Deamon会找到那些其他格式丢失的条目。

实际上,YouTube使用了这种设计。在上载时,它将完成最少的工作。可能甚至只保存原始二进制文件。从最弱到最高,它将依次处理每个视频的不同分辨率/质量版本。

请注意另一个重要的问题是如何将这些blob存储在数据库中/与数据库一起存储。为此,还有one article我也可以链接您。