代码之家  ›  专栏  ›  技术社区  ›  Daniel Schierbeck

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

  •  4
  • Daniel Schierbeck  · 技术社区  · 15 年前

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

    6 回复  |  直到 15 年前
        1
  •  4
  •   Diadistis    15 年前

    我也遇到了同样的问题,解决方法是使用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;
            }
        }
    
        2
  •  3
  •   slugster Joey Cai    13 年前

    我发现 imageresizer 很好。和良好的API。效果很好。 从Visual studio 2010扩展管理器下载: http://nuget.org/ .

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

    1). 安装扩展插件 .

    enter image description here

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



    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
  •   erlando    15 年前

    1. 您允许多大尺寸的图像 对此加以限制??

    2. 当您使用 System.Drawing.Bitmap 正确地我们发现了导致死亡的主要原因之一 System.OutOfMemoryException 我们共享托管平台上的例外情况是用户没有处理 Bitmap 对象正确。

    凯文

        4
  •  1
  •   Sesh    15 年前

    net有一个旧的bug,所有图像默认为每像素32位-在这个大小下,你可以很快耗尽你的内存。请使用PixelFormat结构以确保您的问题不会出现这种情况。

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

        5
  •  0
  •   uriDium    15 年前

    您可能有堆栈跟踪要查看吗?

    要考虑的其他事情。如果您正在处理多个映像或在某个地方有一些危险的循环,那么您是否确保清除()和处置()内容。