Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ASP.NET(带C#)应用程序中以可优化的方式调整图像大小?_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

如何在ASP.NET(带C#)应用程序中以可优化的方式调整图像大小?

如何在ASP.NET(带C#)应用程序中以可优化的方式调整图像大小?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我用C#编写了这段代码: 上面的代码可以针对ASP.NET应用程序进行优化吗 我认为如果1000个用户连接到我的站点,其中20%的用户上传的图像超过125px(宽度和高度),那么应用程序可能会崩溃 我的朋友建议使用Canvas或Drawing2D库。如果已经存在一个文件,会发生什么?是否可以覆盖 抱歉问了个愚蠢的问题。在这种情况下,我需要建议。您可以使用此nuget软件包 如何使用: 我使用了wpf类,这些类应该比旧的System.Drawing类更友好。您可以使用这个nuget包 如何使

我用C#编写了这段代码:

上面的代码可以针对ASP.NET应用程序进行优化吗

我认为如果1000个用户连接到我的站点,其中20%的用户上传的图像超过125px(宽度和高度),那么应用程序可能会崩溃

我的朋友建议使用Canvas或Drawing2D库。如果已经存在一个文件,会发生什么?是否可以覆盖


抱歉问了个愚蠢的问题。在这种情况下,我需要建议。

您可以使用此nuget软件包

如何使用:


我使用了wpf类,这些类应该比旧的System.Drawing类更友好。您可以使用这个nuget包

如何使用:


我使用了wpf类,它应该比旧的系统更友好。绘图类。

20%的用户不太可能在同一秒内上传图像。当然,您应该确保在上传图像时调整图像大小,而不是在提供图像时调整图像大小。更重要的是,如果您的服务器无法完成这项工作,它将不会崩溃,但会将用户放入队列中,这将导致响应时间变慢

请记住,如果您允许匿名用户上传图片,您可能会受到DOS攻击,任何优化都无法阻止这一点。您应该添加代码,主动检查上传是否合法,并在出现问题时阻止新上传

最后,如果代码确实是您所描述的,那么您根本不需要内存流,您可以在创建位图时直接从文件中读取,在保存位图时直接保存到文件中


您可以使用此加载文件并保存它。

20%的用户不太可能在同一秒内上载图像。当然,您应该确保在上传图像时调整图像大小,而不是在提供图像时调整图像大小。更重要的是,如果您的服务器无法完成这项工作,它将不会崩溃,但会将用户放入队列中,这将导致响应时间变慢

请记住,如果您允许匿名用户上传图片,您可能会受到DOS攻击,任何优化都无法阻止这一点。您应该添加代码,主动检查上传是否合法,并在出现问题时阻止新上传

最后,如果代码确实是您所描述的,那么您根本不需要内存流,您可以在创建位图时直接从文件中读取,在保存位图时直接保存到文件中


上载文件时,您可以使用此按钮加载文件并保存它。

按钮上单击

System.Drawing.Bitmap bmpPostedImage = new System.Drawing.Bitmap(File1.PostedFile.InputStream);
     System.Drawing.Image objImage = ScaleImage(bmpPostedImage, 81);
     objImage.Save(SaveLocation,ImageFormat.Png);
     lblmsg.Text = "The file has been uploaded.";

更多细节


上传文件时,单击按钮:

System.Drawing.Bitmap bmpPostedImage = new System.Drawing.Bitmap(File1.PostedFile.InputStream);
     System.Drawing.Image objImage = ScaleImage(bmpPostedImage, 81);
     objImage.Save(SaveLocation,ImageFormat.Png);
     lblmsg.Text = "The file has been uploaded.";

更多细节



20%的用户会同时上传一张图片?我们假设是的。我展示了一个场景,当然,百分比可能会因案例而异。我无法想象上传/浏览的比例为1/4的场景。我强烈建议您。有许多问题需要避免。现在,您正在(a)通过重新编码降低原始文件的质量,(b)无法正确防止内存泄漏。使用
使用
而不是
。处置
,(c)不正确编码JPEG,以及(d)不检测文件格式或正确处理它们。相信我,使用200KB的库是值得的!人们编写自己的服务器端图像处理程序是asp.net服务器可怕死亡的首要原因。20%的用户会同时上传图像?我们认为是的。我展示了一个场景,当然,百分比可能会因案例而异。我无法想象上传/浏览的比例为1/4的场景。我强烈建议您。有许多问题需要避免。现在,您正在(a)通过重新编码降低原始文件的质量,(b)无法正确防止内存泄漏。使用
使用
而不是
。处置
,(c)不正确编码JPEG,以及(d)不检测文件格式或正确处理它们。相信我,使用200KB的库是值得的!人们编写自己的服务器端图像处理程序是asp.net服务器可怕死亡的首要原因。哦,如果我想要额外的软件包,当然我不应该在这里发布我的问题。我需要一些代码样本,而不是额外的软件包。我不需要。无论如何为您的努力Thx然后从您的应用程序中的项目复制代码。通过这种方式,您将获得代码示例,而无需额外的软件包:)WPF使用的内存量与系统相同。Drawing使用的内存量可能更多—虽然许多垃圾收集错误已经修复,但新的错误已经引入。此外,WPF缺少GDI的2次双三次调整,这比WPF的Fant算法要好得多。哦,如果我想要额外的软件包,当然我不应该在这里发布我的问题。我需要一些代码样本,而不是额外的软件包。我不需要。无论如何为您的努力Thx然后从您的应用程序中的项目复制代码。通过这种方式,您将获得代码示例,而无需额外的软件包:)WPF使用的内存量与系统相同。Drawing使用的内存量可能更多—虽然许多垃圾收集错误已经修复,但新的错误已经引入。此外,WPF缺少GDI的2次双三次调整,这比WPF的Fant算法要好得多。匿名用户不会上传。我有过滤器和认证系统,允许一些人上传系统。以上情况是一个场景。您现在是否有性能问题?如果没有,那么考虑第一和第二规则的优化:1。不要这样做。2(仅限专家用户!)暂时不要这样做!一个。上面的代码使用MemoryStream,如果有人上传图像,会自动调用my函数来调整它们的大小。也就是说,使用内存。我的代码可以优化吗?在我看来,您可以直接保存到磁盘,而不是先保存到内存中;(答案更新)匿名用户不会上传。我有过滤器和认证系统,允许一些人上传系统
public static System.Drawing.Image ScaleImage(System.Drawing.Image image, int maxHeight)
        {
            var ratio = (double)maxHeight / image.Height;

            var newWidth = (int)(image.Width * ratio);
            var newHeight = (int)(image.Height * ratio);

            var newImage = new Bitmap(newWidth, newHeight);
            using (var g = Graphics.FromImage(newImage))
            {
                g.DrawImage(image, 0, 0, newWidth, newHeight);
            }
            return newImage;
        }