我正在创建一个接受来自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;
}
答案 0 :(得分:0)
我的第一个建议是不要在ASP.Net中进行大量工作。 ASP.Net already has serious memory issues在paralell中每个CPU Core 可能运行100个请求。关于您要做的最后一件事,是在其工作列表中添加更多内容。尤其是像图像处理这样的内存消耗。
我将在ASP.Net中做我需要做的最少工作-主图像和缩略图。其他部分的准备工作?那些可以移到后台进程中。列表中的Deamon会找到那些其他格式丢失的条目。
实际上,YouTube使用了这种设计。在上载时,它将完成最少的工作。可能甚至只保存原始二进制文件。从最弱到最高,它将依次处理每个视频的不同分辨率/质量版本。
请注意另一个重要的问题是如何将这些blob存储在数据库中/与数据库一起存储。为此,还有one article我也可以链接您。