【问题标题】:How to efficiently scale and crop images in an ASP.NET app?如何在 ASP.NET 应用程序中有效地缩放和裁剪图像?
【发布时间】:2010-10-14 07:23:36
【问题描述】:

我们在使用允许用户上传和裁剪图像的 ASP.NET 应用程序时遇到问题。之后图像都被缩放到固定大小。当处理一个大文件时,我们基本上会耗尽内存;似乎 JPEG 的处理效率很低——我们使用的是 System.Drawing.BitMap。你有什么一般性的建议,也许还有一些指向更高效的图像处理库的建议吗?你有什么经验?

【问题讨论】:

标签: asp.net image


【解决方案1】:

我遇到了同样的问题,解决方案是使用 System.Drawing.Graphics 进行转换,并在我完成后立即处理每个位图对象。这是我图书馆的一个样本(调整大小):

    public Bitmap ApplyTo(Bitmap bitmap)
    {
        using (bitmap)
        {
            Bitmap newBitmap = new Bitmap(bitmap, CalculateNewSize(bitmap));

            using (Graphics graphics = Graphics.FromImage(newBitmap))
            {
                graphics.SmoothingMode =
                    SmoothingMode.None;
                graphics.InterpolationMode =
                    InterpolationMode.HighQualityBicubic;
                graphics.CompositingQuality =
                    CompositingQuality.HighQuality;

                graphics.DrawImage(
                    bitmap,
                    new Rectangle(0, 0, newBitmap.Width, newBitmap.Height));
            }

            return newBitmap;
        }
    }

【讨论】:

  • 我做的图像裁剪和缩放与此类似。关键是将你的代码放在'using'语句中,一旦你离开 using 块的分数,它就会自动处理资源。否则,您将无法处理图像数据 == 浪费内存。
  • +1 用于处理。我看到我们的客户一直忘记/不知道这样做。
  • 28 other pitfalls 你应该检查你的代码,但是这可能不是你遇到的唯一一个。
【解决方案2】:

我找到了imageresizer,它很棒。和良好的 API。效果很好。 从 Visual Studio 2010 扩展管理器下载:http://nuget.org/

在 VS-2010 中下载 API 的简单步骤:

1)。安装扩展程序http://nuget.org/



3)。查找并安装 ImageResizing


4).Then 代码:(我在这里使用裁剪。您可以使用任何)imageresizing.net 上的文档

string uploadFolder = Server.MapPath(Request.ApplicationPath + "images/");
FileUpload1.SaveAs(uploadFolder + FileUpload1.FileName);


//The resizing settings can specify any of 30 commands.. See http://imageresizing.net for details.
ResizeSettings resizeCropSettings = new ResizeSettings("width=200&height=200&format=jpg&crop=auto");

//Generate a filename (GUIDs are safest).
string fileName = Path.Combine(uploadFolder, System.Guid.NewGuid().ToString());

//Let the image builder add the correct extension based on the output file type (which may differ).
fileName = ImageBuilder.Current.Build(uploadFolder + FileUpload1.FileName, fileName, resizeCropSettings, false, true);

试试!!!它非常糟糕且易于使用。谢谢。

【讨论】:

    【解决方案3】:

    脑海中浮现出一些想法-

    1. 你允许多大的图片 你的用户上传,你能 对此施加限制?

    2. 当您使用 System.Drawing.Bitmap班,你在吗 记得把它扔掉 正确吗?我们发现在我们的共享托管平台上出现System.OutOfMemoryException 异常的主要原因之一是用户没有正确处理Bitmap 对象。

    凯夫

    【讨论】:

      【解决方案4】:

      .net 有一个较旧的错误,即所有图像默认为每像素 32 位 - 在这种大小下,您可能会很快耗尽内存。请使用 PixelFormat 结构来确保您的问题不是这种情况。

      此链接可能会有所帮助:http://msdn.microsoft.com/en-us/library/aa479306.aspx

      【讨论】:

        【解决方案5】:

        您是否有堆栈跟踪要查看?

        在用户上传图片后,我还进行了一些图片编辑。我遇到的唯一问题是浏览器上文件上传大小的限制和超时。但与 .Net 的库无关。

        还有其他需要考虑的。如果您正在制作多张图像或在某处有一些危险的循环,那么您是否确保 flush() 和 dispose() 东西。

        【讨论】:

          猜你喜欢
          • 2014-03-27
          • 1970-01-01
          • 2017-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-21
          • 1970-01-01
          • 2020-01-04
          相关资源
          最近更新 更多