【问题标题】:C#: How to reduce memory and CPU consumption when working with Bitmaps?C#:使用位图时如何减少内存和 CPU 消耗?
【发布时间】:2011-11-01 12:05:14
【问题描述】:

我有一个处理图像编辑(裁剪和调整大小)的 Windows 应用程序项目。不幸的是,这些图像处理消耗了大量的内存和 CPU 资源(很容易达到 600MB 或 50% cpu),而且只需要裁剪和调整一张 2.5MB (2300*5400px) 的 gif 图像。不仅如此,由于资源消耗大,程序在调整大小时卡住了......

    public static Image Resize(Image imgToResize, Size size)
    {
        Bitmap b = new Bitmap(size.Width, size.Height);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.Default;
        g.SmoothingMode = SmoothingMode.HighSpeed;
        g.PixelOffsetMode = PixelOffsetMode.Default;
        g.DrawImage(imgToResize, 0, 0, size.Width, size.Height);
        g.Dispose();

       return (Image)b;
    }

    public static Image Crop(Image img, Point p1, Point p2)
    {
        Rectangle cropArea = new Rectangle(p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y);
        return (img as Bitmap).Clone(cropArea, img.PixelFormat);
    }

我应该使用什么方法来避免这种情况? 我已经尝试以多种格式将其压缩为内存流,但没有帮助(甚至变得更糟)

注意:我使用标准的 .NET 绘图库:System.Drawing、System.Drawing.Imaging

【问题讨论】:

    标签: c# memory graphics bitmap


    【解决方案1】:

    编写 Application.DoEvents();在你的函数中,至少它不会卡住

    【讨论】:

      【解决方案2】:

      再次提示:

      例如在调整大小时,就像@Hans 指出的那样,您创建了一个新的位图,这是您的瓶颈。

      但是,如果您只是 绘制 调整大小的图像,与最初加载的图像相同(显然您之前在磁盘上制作了原始图像的备份文件)。

      裁剪后,如果您只是绘制用户裁剪的位图的一部分,那么用户将只能看到该矩形。 ?

      我的意思是,一般来说,对你已有的图像进行操作,并尝试(尽可能)不要为它初始化新对象。

      问候。

      【讨论】:

        【解决方案3】:

        来自这个问题的早期版本:http://snippets.dzone.com/posts/show/4336

        另外,AForge.net 有几个调整大小的功能

        【讨论】:

          【解决方案4】:

          您的代码正在创建图像的副本,因此当您调用这些方法时,您应该预期非托管内存使用量会增加。重要的是你如何处理原件。摆脱它是明智的,这样它就不再占用内存。您必须调用它的 Dispose() 方法才能这样做。等待垃圾收集器完成它需要很长时间。 Bitmap 类占用很少的托管内存,但占用大量非托管内存。

          【讨论】:

            【解决方案5】:

            这是一个棘手的问题,我以前遇到过。您可以根据文件的大小将图像分成 x 块,然后将每块保存到磁盘以确保内存是干净的。

            接下来,您每次调整一个组件图像的大小,以确保在处理下一个组件之前处理该组件。完成后,将它们重新缝合在一起,然后裁剪。

            这种方法的一个主要问题 - 如果您要向上调整大小,这种方法会在您的图像中放置接缝,因为插值不会有周围的像素可以猜测。但我认为这种方法可以很好地向下调整大小。

            HTH。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-18
              • 1970-01-01
              • 2015-05-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多