Image visualc&x2B+;,系统图形中的系统参数异常(Windows窗体)

Image visualc&x2B+;,系统图形中的系统参数异常(Windows窗体),image,exception,load,c++-cli,Image,Exception,Load,C++ Cli,运行程序并尝试加载映像时会显示此错误: System.Drawing.dll中发生类型为“System.ArgumentException”的首次意外异常 System.Drawing.dll中发生类型为“System.ArgumentException”的未处理异常 其他信息:参数无效 这是我的密码: 基本上,有一个数字UpDown、一个按钮、一个openFileDialog和一个pictureBox。用户根据要加载的图片更改numericUpDown的值(用户不必打开openFileDial

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

System.Drawing.dll中发生类型为“System.ArgumentException”的首次意外异常 System.Drawing.dll中发生类型为“System.ArgumentException”的未处理异常

其他信息:参数无效

这是我的密码:

基本上,有一个数字UpDown、一个按钮、一个openFileDialog和一个pictureBox。用户根据要加载的图片更改numericUpDown的值(用户不必打开openFileDialog)。例如,如果用户选择“3”作为numericUpDown的值,则openFileDialog的文件名将为:

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

         }
公共:
void Set_FilePath()
{
int n=(int)numericUpDown1->Value;
开关(n)
{
案例1:openFileDialog1->FileName=“C:\Users\Public\Pictures\Sample Pictures\jummy.jpg”中断;
案例2:openFileDialog1->FileName=“C:\Users\Public\Pictures\Sample Pictures\Desert.jpg”中断;
案例3:openFileDialog1->FileName=“C:\Users\Public\Pictures\Sample Pictures\Hydrangeas.jpg”中断;
案例4:openFileDialog1->FileName=“C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg”中断;
案例5:openFileDialog1->FileName=“C:\Users\Public\Pictures\Sample Pictures\Koala.jpg”中断;
案例6:openFileDialog1->FileName=“C:\Users\Public\Pictures\Sample Pictures\Lighthouse.jpg”中断;
案例7:openFileDialog1->FileName=“C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg”中断;
案例8:openFileDialog1->FileName=“C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg”中断;
}
}
私有:系统::无效按钮1\u单击(系统::对象^sender,系统::事件参数^e){
位图^myImage;
设置文件路径();
myImage=gcnew位图(openFileDialog1->FileName);
pictureBox1->SizeMode=PictureBoxSizeMode::StretchImage;
pictureBox1->Image=dynamic\u cast(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);
             }
if(openFileDialog1->ShowDialog()==System::Windows::Forms::DialogResult::OK)
{
MessageBox::Show(openFileDialog1->FileName);
myImage=gcnew位图(openFileDialog1->FileName);
pictureBox1->SizeMode=PictureBoxSizeMode::StretchImage;
pictureBox1->Image=dynamic\u cast(myImage);
}
这是完美的工作。此外,还会出现一个显示openFileDialog文件名的消息框。。。正确的图像方向。。。我不知道我的程序出了什么问题。问题是我不希望出现openFiledialog

(我使用Visual StudioC++ 2010,应用程序是用Windows窗体制作的),欢迎大家的帮助。


谢谢。

图像和位图类引发的异常信息不是很丰富。由于多种原因,可能会出现“参数无效”异常。它可能是一个损坏的图像文件,在您的情况下不太可能,因为您使用的是库存Windows图像文件。它也可能是由于映像太大而无法放入可用虚拟内存地址空间造成的。你想要一个OutOfMemoryException,但GDI+对此很愚蠢

这是更可能的原因,当您运行一段时间时,您的程序很可能会像那样受到影响。图像可能需要大量非托管虚拟内存来存储其像素数据。当您不再使用该图像时,应将其释放。垃圾收集器将为您完成这项工作,但它并没有那么快。当然,位图类存在一个问题,它使用很少的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位程序。

仍然不起作用:myImage=gcnew-Bitmap(openFileDialog1->FileName);Works 100%myImage=gcnew位图(textBox1->Text);同样有效100%myImage=gcnew BitMap(“图像”)不起作用(异常错误:参数无效),即使我按照您所说的方式修复了代码。谢谢你的尝试,新的位图(“图像”)到底应该做什么?您没有名为“Image”的文件,参数无效。继续尝试。否则我如何加载图像?