【问题标题】:Rotating image causes outofmemory Exception旋转图像导致内存不足异常
【发布时间】:2010-09-09 17:03:31
【问题描述】:

当我在服务器上旋转图像时。它会导致内存不足异常。

    /// <summary>
    /// Rotates the specified img.
    /// </summary>
    /// <param name="img">The img.</param>
    /// <param name="rotationAngle">The rotation angle.</param>
    /// <returns></returns>
    public static Bitmap Rotate(Image img, float rotationAngle)
    {
        //create an empty Bitmap image
        Bitmap bmp = new Bitmap(img.Width, img.Height);

        //turn the Bitmap into a Graphics object
        using (Graphics gfx = Graphics.FromImage(bmp))
        {
            //now we set the rotation point to the center of our image
            gfx.TranslateTransform((float) bmp.Width/2, (float) bmp.Height/2);

            //now rotate the image
            gfx.RotateTransform(rotationAngle);

            gfx.TranslateTransform(-(float) bmp.Width/2, -(float) bmp.Height/2);

            //set the InterpolationMode to HighQualityBicubic so to ensure a high
            //quality image once it is transformed to the specified size
            gfx.SmoothingMode = SmoothingMode.HighQuality;
            gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
            gfx.CompositingQuality = CompositingQuality.HighQuality;
            gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;

            //now draw our new image onto the graphics object
            gfx.DrawImage(img, new Point(0, 0));
        }

        //return the image
        return bmp;
    }

此行发生异常:gfx.DrawImage(img, new Point(0, 0)); 我在互联网上搜索过,发现很多人有类似的问题,但没有解决方案。

有解决办法吗?或者除了 GDI+ 之外还有其他库可以用来旋转我的图像吗?也许 WPF 中有什么东西?

堆栈跟踪:

[OutOfMemoryException: Out of memory.]
   System.Drawing.Graphics.CheckErrorStatus(Int32 status) +1588745
   System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y) +227
   System.Drawing.Graphics.DrawImage(Image image, Point point) +26
   Chucksoft.Core.Drawing.ImageResizer.Rotate(Image img, Single rotationAngle) in C:\Projects\ChucksoftCore\Branches\2.5.0\Source\Chucksoft.Core\Drawing\ImageResizer.cs:245
   Chucksoft.Core.Drawing.ImageResizer.Rotate(Byte[] b, Single angle, ImageFormat format) in C:\Projects\ChucksoftCore\Branches\2.5.0\Source\Chucksoft.Core\Drawing\ImageResizer.cs:22
   TheMemorableMoments.Domain.Services.ImageService.Rotate(IEnumerable`1 media, User user, Single angle) in C:\Projects\TheMemorableMoments\Branches\2.1.0\Source\TheMemorableMoments\Domain\Services\ImageService.cs:34
   TheMemorableMoments.Domain.Services.ImageService.RotateLeft(List`1 media, User user) in C:\Projects\TheMemorableMoments\Branches\2.1.0\Source\TheMemorableMoments\Domain\Services\ImageService.cs:69
   TheMemorableMoments.UI.Controllers.User.PhotosController.Rotate(IMediaFiles media, Action`2 resizeMethod) in C:\Projects\TheMemorableMoments\Branches\2.1.0\Source\TheMemorableMoments.UI\Controllers\User\PhotosController.cs:408
   TheMemorableMoments.UI.Controllers.User.PhotosController.RotateLeft(Media media) in C:\Projects\TheMemorableMoments\Branches\2.1.0\Source\TheMemorableMoments.UI\Controllers\User\PhotosController.cs:396
   lambda_method(Closure , ControllerBase , Object[] ) +127
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +258
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.&lt;&gt;c__DisplayClassd.&lt;InvokeActionMethodWithFilters&gt;b__a() +125
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709
   System.Web.Mvc.Controller.ExecuteCore() +162
   System.Web.Mvc.&lt;&gt;c__DisplayClass8.&lt;BeginProcessRequest&gt;b__4() +58
   System.Web.Mvc.Async.&lt;&gt;c__DisplayClass1.&lt;MakeVoidDelegate&gt;b__0() +20
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously)

【问题讨论】:

  • 你的图片有多大?
  • 2 到 3 兆。它所在的服务器有 4 个演出。
  • 这很奇怪。没有什么让我觉得有内存泄漏。就调试而言,您是否尝试过仅在位图上绘制而不进行任何转换?尝试找出哪个属性会导致异常缩小一点。泄漏是与此函数隔离的,还是只是在此特定调用中内存不足?
  • 你的代码在使用完返回的Bitmap后处理了吗?
  • 所有位图都被释放。仍然出现错误...

标签: c# out-of-memory


【解决方案1】:

我让它工作了。我从未想过“内存不足”异常。相反,我使用了 Image Class 的 RotateFlip 方法。查看 RotateFlip 代码,在 Reflector 中,它是对 Native Library 的直接调用。这种方法的缺点是您只能以 90 度的增量旋转。对我来说效果很好。

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 2017-08-23
    • 2012-12-15
    • 2014-08-26
    • 2016-04-21
    • 1970-01-01
    • 2011-05-26
    • 2013-06-22
    • 2013-12-09
    相关资源
    最近更新 更多