Visual C ++,系统绘图中的系统参数异常(Windows窗体)

时间:2013-10-11 20:29:58

标签: image exception load c++-cli

运行程序并尝试加载图像时会显示此错误:

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形式制作的),任何帮助将不胜感激。 感谢..

1 个答案:

答案 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位程序。