繁体   English   中英

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

[英]System.Drawing.Bitmap(int32,int32) parameter not valid in WPF but not win-forms

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

任何帮助,将不胜感激。

内存使用量约为1,400 MB

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

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

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

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

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

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

WPF中的BitmapEffect不是Bitmap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM