gpt4 book ai didi

c# - DrawToBitmap - System.ArgumentException : Parameter is not valid

转载 作者:太空狗 更新时间:2023-10-29 22:27:31 25 4
gpt4 key购买 nike

我正在创建一个 Label,有时我会使用 .DrawToBitmap()。我不知道为什么,但在我运行我的程序一段时间后(并经常调用 .DrawToBitmap())我得到了异常:

System.ArgumentException: Parameter is not valid.
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)

不知怎么的,我不能经常调用这个函数。如果我从根本上尝试这个:

while(true)
{

System.Windows.Forms.Label label = new Label();

label.Font = new Font("Arial", 20);
label.Text = "test";

try
{
Bitmap image = new Bitmap(300, 500);
label.DrawToBitmap(image, label.ClientRectangle);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}

我在 5-6 秒(1000-2000 次调用)后得到异常。问题是什么?如何避免这种情况?

编辑:感谢你们关于 Dispose() 的想法 - 如果我在 label 上使用它,不知何故一切都完美无缺。即使我不在 Bitmap 上使用它也很好。两个答案都很好,我只能接受其中一个:(

最佳答案

因此,该错误消息来自 GDI+ 的深处,并且可能由于很多原因而出现。但是,我发现您的代码有一个明显的问题是候选者:

 label.Font = new Font("Arial", 20);

Font 对象实现了 IDisposable 并且您在一个紧密的循环中创建了很多它们并且从不调用 Dispose()。位图本身也是如此。我敢打赌 GDI 资源快用完了。

很难按原样理解您的代码。它基本上除了创建大量的 FontBitmap 对象外什么都不做,所以我什至不能建议将这些声明中的每一个都包装在 using声明。除此之外,当您快速连续创建大量 GDI 对象而不处理它们时,您最终会遇到这个问题。

如果您需要这些对象在一段时间内有效,那么您需要确保稍后对它们调用 Dispose() 以尽可能及时地释放 native 资源(终结器将为你做这件事,但最好不要等待它)。如果它们是本地对象,则将它们包装在 using 语句中,以便在 block 退出时调用 Dispose():

using(var b = new Bitmap(w, h))
{
// use 'b' for whatever
} // b.Dispose() is called for you

关于c# - DrawToBitmap - System.ArgumentException : Parameter is not valid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11996335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com