如何在ASP.NET应用程序中有效地缩放和裁剪图像?

时间:2009-03-19 12:50:36

标签: asp.net image

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

6 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,解决方法是使用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;
        }
    }

答案 1 :(得分:3)

我找到imageresizer并且很棒。和良好的API。效果很好。 从Visual Studio 2010 Extension Manager下载:http://nuget.org/

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

1)。安装分机http://nuget.org/

enter image description here

3)。查找并安装ImageResizing
enter image description here

4)。然后代码:(我在这里使用裁剪。你可以使用任何)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);

尝试!!!它非常棒且易于使用。感谢。

答案 2 :(得分:1)

想到几个想法 -

  1. 您允许的图像尺寸 您的用户上传,可以 对此施加限制?

  2. 当你使用的时候 System.Drawing.Bitmap上课,是吗? 记得处理它 是否正确?我们发现,在我们的共享托管平台上System.OutOfMemoryException例外的主要原因之一是用户没有正确处理Bitmap个对象。

  3. 千电子伏

答案 3 :(得分:1)

.net中存在一个较旧的错误,即所有图像默认为每像素32位 - 在这个尺寸下,您可以非常快地耗尽内存。请使用PixelFormat结构来确保您的问题不是这样。

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

答案 4 :(得分:1)

CodeProject上有一篇很好的文章。非常好的一个。将尝试找到链接(大约4年后使用它。)

更新:

不是我想要的那个,但看起来也不错。

http://www.codeproject.com/KB/custom-controls/ImageCroppingControl.aspx

答案 5 :(得分:0)

你可能有一个堆栈跟踪要看吗?

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

要考虑的其他事项。如果你正在做多个图像或者在某个地方有一些危险的循环,那么你是否确保flush()和dispose()的东西。