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

什么';从同一来源生成多个图像的最有效方法是什么?C#/Asp.Net,c#,asp.net-mvc,asp.net-core,imagesharp,C#,Asp.net Mvc,Asp.net Core,Imagesharp,我正在创建一个应用程序,该应用程序接受来自IP摄像头的大图像,并将其显示在网站上。目前,图像分辨率为4K,大小范围在1MB到3MB之间 这些图像将显示在图库中 为此,我只需要两个图像。灯箱有一个250 x 160的缩略图和一个更大的图像(我选择了1280 x 720)。但是,对于站点的其他部分,同时获取四张图像可能更有效 我选择的图书馆目前是SixLabors.ImageSharp 问题是,下面的代码是否是从一个映像生成映像而不存在内存泄漏或其他陷阱的有效方法 这段代码最终将被改写成AzureF

我正在创建一个应用程序,该应用程序接受来自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;
        }
公共异步任务生成缩略图(流源,ImageSizes[]大小)
{
//测试数据
大小=新图像大小[]{new ImageSizes{Name=“720p”,高度=720,宽度=1280},
新图像大小{Name=“1080p”,高度=1080,宽度=1920},
新图像大小{Name=“gallery”,高度=160,宽度=250},
新图像大小{Name=“thumb”,高度=30,宽度=30};
列出所有任务=新列表(大小.长度);
foreach(变量大小,以大小为单位)
{
allTasks.Add(Task.Run)(()=>
{
var outputStream=new MemoryStream();
使用(Image rawImage=Image.Load(源))
{
Mutate(x=>x.Resize(size.Width,size.Height));
Save(outputStream,新的JPEG编码器(){Quality=40});
}
使用(var fileStream=outputStream)
{
//在此处执行操作。上载到Azure Blob/容器或保存到磁盘等。。。
//blob.UploadFromStream(outputStream);
}
}));
}
等待任务。WhenAll(所有任务);
//做点别的;
}

我的第一个建议是不要在ASP.Net中完成大部分工作。以并行方式运行每个CPU核心可能100个请求。关于最后一件事,你想做的,是添加更多到它的工作列表。尤其是像记忆猪一样的图像处理

我会尽我所能在ASP.Net中完成最少量的工作——主图像和缩略图。其他部分的准备工作?这些可以移到后台进程中。一个Deamon在列表中查找那些其他格式丢失的条目

实际上YouTube就是这样设计的。在上传时,它将做最少的工作。甚至可能只保存原始二进制文件。它将一个接一个地对每个视频执行不同的分辨率/质量版本,从最弱到最高


注意:另一个重要的问题是如何在数据库中存储这些blob。为此,我也可以链接您。

我的第一个建议是不要在ASP.Net中完成大部分工作。以并行方式运行每个CPU核心可能100个请求。关于最后一件事,你想做的,是添加更多到它的工作列表。尤其是像记忆猪一样的图像处理

我会尽我所能在ASP.Net中完成最少量的工作——主图像和缩略图。其他部分的准备工作?这些可以移到后台进程中。一个Deamon在列表中查找那些其他格式丢失的条目

实际上YouTube就是这样设计的。在上传时,它将做最少的工作。甚至可能只保存原始二进制文件。它将一个接一个地对每个视频执行不同的分辨率/质量版本,从最弱到最高


注意:另一个重要的问题是如何在数据库中存储这些blob。为此,我也可以链接到您。

听起来像ImageSharp。Web将帮助您。听起来像ImageSharp。Web将帮助您。