1

我正在将一些代码从 Windows 窗体程序移动到 WPF 程序,并且在以下代码中遇到错误。

    //our private vars
    private Bitmap bmp;
    private Graphics g;

    public NewFitnessCalculator()
    {
        bmp = new System.Drawing.Bitmap(Tools.MaxWidth, Tools.MaxHeight);
        g = Graphics.FromImage(bmp);
    }

该错误表明 的参数new System.Drawing.Bitmap无效,但据我所知,它们都是无效的int(即使直接转换为 ,问题仍然存在int)。此外,此代码在 Windows 窗体版本中运行良好 - 我不确定这是否是 WPF 的问题。在这种情况下Tools.MaxWidth/Heightpublic static ints来自另一个类(也public static)。它们被初始化为 200,然后分别设置为另一个位图的宽度和高度。

任何帮助,将不胜感激。

4

2 回答 2

5

内存使用量约为 1,400 MB

目前尚不清楚这是工作集大小还是进程的 VM 大小。如果您使用任务管理器,那么您通常会查看工作集,即程序使用的RAM量。

在这种情况下,1,400 兆字节肯定会让您处于 32 位进程的危险区域。当进程的VM 大小接近 32 位进程可以寻址的最大虚拟内存量(2 GB)时,分配开始失败。你几乎可以肯定非常接近这个极限。

将失败的分配类型是大的,地址空间中没有足够大的孔来适应请求的大小。位图无疑是一个非常好的候选者,因为它们可以为像素数据消耗大量的 VM 空间。

在这种情况下,您会期望出现 OutOfMemoryException。但是 GDI+ 会产生糟糕的异常,它假定真正的问题是您要求的位图太大。这并非完全没有优点,但是当您创建一个 465 x 465 像素的位图时,它会变得有点难卖。Anyhoo,它会生成“参数无效”异常消息而不是 OOM,归咎于您请求的大小。

目前还不清楚你是如何最终使用这么多内存的。但是,当您在 .NET 代码中使用 Bitmap 类时,这是非常常见的,这是一个您不能再忽略 Dispose() 方法的 .NET 类。强烈暗示您不注意这一点是您将其预先分配为 200x200 位图的评论。这是一个非常糟糕的主意,你几乎肯定不会处理它。

因此,您需要做的第一件事就是彻底检查您的代码并在不再使用位图时处理它们。如有必要,请使用内存分析器来查找泄漏。将 EXE 项目的平台目标设置从 x86 更改为 AnyCPU 是在 64 位操作系统上获得大量 VM 空间的一种非常简单的方法。从长远来看,您可能最终还是会使用 BitmapSource 和 WriteableBitmap 类替换此代码。

于 2013-07-02T09:35:42.377 回答
-1

WPF中有BitmapEffect而不是Bitmap

于 2013-07-02T08:22:46.393 回答