2013-10-11 85 views
0

此错误显示了运行该程序,并尝试加载图像时:的Visual C++,在系统图(Windows窗体)系统参数异常

类型的第一个机会异常“System.ArgumentException”发生系统。 Drawing.dll 类型“System.ArgumentException”未处理的异常发生在System.Drawing.dll程序

附加信息:该参数是无效的。

这里是我的代码:

基本上,有一个的NumericUpDown,一个按钮,一个OpenFileDialog和一个PictureBox。用户根据他要加载的图片更改numericUpDown的值(用户不必打开openFileDialog)。例如,如果用户选择“3”作为一个的NumericUpDown值时,打开文件对话框的文件名是:

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出现。

(我使用Visual Studio C++ 2010中,应用程序在Windows的形式提出),任何帮助,将不胜感激。 谢谢..用图像和位图类提出

回答

0

例外也不是很丰富。由于几个原因,您可以获得“参数无效”异常。它可能是一个损坏的图像文件,因为您正在使用库存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); 
} 

注意添加删除话务员呼叫,这是调用了IDisposable ::处置的一个()。它将摆脱旧图像,这是您不再需要的图像,因为您将显示其他图像。 try/catch可以确保程序在芯片关闭时保持运行,处理不好的图像文件或者不适合可用内存的怪物。您通过定位x64来处理的类型,以便获得64位程序。

+0

它仍然不起作用:myImage = gcnew位图(openFileDialog1-> FileName); Works 100%myImage = gcnew Bitmap(textBox1-> Text);也有效100%myImage = gcnew BitMap(“图像”)不起作用(异常错误:参数无效),即使我按照你说的方式修复了代码。感谢您的试用 –

+0

gcnew位图(“Image”)应该做什么?您没有名为“Image”的文件,该参数无效。继续尝试。 –

+0

我怎样才能加载图像? –