c#:如何在使用位图时减少内存和CPU消耗

本文关键字:内存 消耗 CPU 位图 | 更新日期: 2023-09-27 18:06:18

我有一个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。画画,System.Drawing.Imaging

c#:如何在使用位图时减少内存和CPU消耗

您的代码正在创建映像的副本,因此当您调用这些方法时,您应该期望非托管内存使用量上升。重要的是你如何处理原作。你最好删除它,这样它就不再占用内存了。您必须调用它的Dispose()方法才能这样做。等待垃圾收集器执行此操作花费的时间太长。Bitmap类占用很少的托管内存,但占用大量的非托管内存。

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

另外,AForge.net有几个调整大小的函数

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

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

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

HTH .

再次提示:

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

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

裁剪后,如果你只是绘制位图的一部分,用户裁剪,所以用户将只看到那个矩形。

?

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

问候。

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