0

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

System.Drawing.dll 中出现“System.ArgumentException”类型的第一次机会异常 System.Drawing.dll 中出现“System.ArgumentException”类型的未处理异常

附加信息:参数无效。

这是我的代码:

基本上,有一个 numericUpDown、一个按钮、一个 openFileDialog 和一个图片框。用户根据他想要加载的图片更改 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 形式制作的),任何帮助将不胜感激。谢谢..

4

1 回答 1

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);
 }

请注意添加的删除运算符调用,即调用 IDisposable::Dispose() 的调用。它摆脱了旧图像,因为您将显示另一张图像,因此您不再需要该图像。try/catch 可确保您的程序在芯片关闭时继续运行,处理坏图像文件或无法放入可用内存的怪物文件。您通过以 x64 为目标来处理的那种,因此您可以获得 64 位程序。

于 2013-10-11T22:26:31.760 回答