System.Drawing.Bitmap(int32,int32)参数在WPF中无效,但在win-forms中无效

时间:2013-07-02 07:24:33

标签: c# wpf

我正在将一些代码从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/Height来自另一个类public static intspublic static)。它们初始化为200,然后分别设置为另一个位图的宽度和高度。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:5)

  

内存使用量约为1,400 MB

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

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

失败的分配类型很大,地址空间中没有足够大的空洞可以满足要求的大小。 Bitmap肯定是一个非常好的候选者,因为它们可以为像素数据消耗大量的VM空间。

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

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

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

答案 1 :(得分:-1)

WPF中有BitmapEffect而不是Bitmap