1

我正在创建一个应用程序,它接受来自 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;
        }
4

1 回答 1

0

我的第一个建议是不要在 ASP.Net 中完成大部分工作。ASP.Net 已经存在严重的内存问题,因为每个 CPU内核可能并行运行 100 个请求。关于你想做的最后一件事,就是在它的工作列表中添加更多内容。尤其是像图像处理这样的记忆猪。

我会在 ASP.Net 中做最少的事情——主图像和缩略图。其他部分的准备工作?这些可以移出到后台进程中。一个从列表中删除的守护程序会找到那些其他格式缺失的条目。

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

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

于 2019-12-22T02:43:32.857 回答