运行程序并尝试加载图像时会显示此错误:
System.Drawing.dll中发生了'System.ArgumentException'类型的第一次机会异常 System.Drawing.dll
中发生了未处理的“System.ArgumentException”类型异常附加信息:参数无效。
这是我的代码:
基本上,有一个numericUpDown,一个按钮,一个openFileDialog和一个pictureBox。用户更改numericUpDown的值,具体取决于他想要加载的图片(用户不必打开openFileDialog)。例如,如果用户选择“3”作为numericUpDown的值,则openFileDialog的FileName将为:
Public:
void Set_FilePath()
{
int n = (int)numericUpDown1->Value;
switch (n)
{
case 1: openFileDialog1->FileName = "C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"; break;
case 2: openFileDialog1->FileName = "C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"; break;
case 3: openFileDialog1->FileName = "C:\Users\Public\Pictures\Sample Pictures\Hydrangeas.jpg"; break;
case 4: openFileDialog1->FileName = "C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg"; break;
case 5: openFileDialog1->FileName = "C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"; break;
case 6: openFileDialog1->FileName = "C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg"; break;
case 7: openFileDialog1->FileName = "C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg"; break;
case 8: openFileDialog1->FileName = "C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"; break;
}
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Bitmap^ myImage;
Set_FilePath();
myImage = gcnew Bitmap( openFileDialog1->FileName );
pictureBox1->SizeMode = PictureBoxSizeMode::StretchImage;
pictureBox1->Image = dynamic_cast <Image^> (myImage);
}
我试图修复它:
我以为我没有正确复制图像的方向。所以我将代码更改为:
if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
MessageBox::Show(openFileDialog1->FileName);
myImage = gcnew Bitmap( openFileDialog1->FileName );
pictureBox1->SizeMode = PictureBoxSizeMode::StretchImage;
pictureBox1->Image = dynamic_cast <Image^> (myImage);
}
这很完美。此外,出现了一个显示openFileDialog文件名的消息框......正确的图像方向......我不知道我的程序有什么问题。问题是我不希望出现openFiledialog。
(我使用的是Visual Studio C ++ 2010,应用程序是以windows形式制作的),任何帮助将不胜感激。 感谢..
答案 0 :(得分:0)
Image和Bitmap类引发的异常信息量不大。出于多种原因,您可以获得“参数无效”异常。它可能是一个已损坏的图像文件,因为您使用的是Windows图像文件,因此不太可能。它也可能是由于图像太大而无法放入可用的虚拟内存地址空间。你想要一个OutOfMemoryException,但GDI +对它很愚蠢。
这是更可能的原因,当你运行一段时间时,你的程序很可能会像那样叮咬。图像可能需要大量非托管虚拟内存来存储其像素数据。当你不再使用图像时应该释放。垃圾收集器会为你做这件事,但它并不是那么快。当然这是Bitmap类的一个问题,它使用非常少的GC堆,因此不太可能经常触发垃圾收集以使您远离麻烦。
这就是它实现IDisposable接口的原因。 Dispose()方法可以尽早释放内存。你没有打电话。
您需要在代码中修复此问题,例如:
delete picureBox1->Image;
try {
myImage = gcnew Bitmap( openFileDialog1->FileName );
pictureBox1->Image = myImage;
}
catch (Exception^ ex) {
pictureBox1->Image = nullptr;
MessageBox::Show(ex->Message);
}
注意添加的 delete 操作符调用,即调用IDisposable :: Dispose()的操作符。它摆脱了旧图像,你不再需要它,因为你要显示另一个图像。 try / catch确保你的程序在芯片关闭时继续运行,处理坏的图像文件或者不适合可用内存的怪物。您通过定位x64来处理这种类型,以便获得64位程序。