我正在将一些代码从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 ints
(public static
)。它们初始化为200,然后分别设置为另一个位图的宽度和高度。
任何帮助都将不胜感激。
答案 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