2013-03-11 43 views
1

我正在应用程序中有一个conbobox和一个picturebox。用户选择一个路径,并且conbobox将路径加载到2000个图像,并显示第一个路径。当用户更改conbobox的索引时,显示的图像会发生变化,但我不知道如何删除图片框中的图像。Windows窗体 - 图片框。如何删除图像

如果我只是覆盖图像它没有做的工作,因为当我反复做这个程序崩溃,因为内存。如何删除图片框内的图片?

编辑: 我做了很少的变化,似乎无法再次重现错误..所以也许这是别的。但只是为了检查,这是代码泄漏的内存?

tips:config是一个单独的元素,包含一些信息,在这种情况下,图像在哪里。

private: System::Void comboBox_image1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { 
     System::String^ aux; 
     DIC_config* config=DIC_config::Instance(); 
     if(config->images_path!=NULL){ 
      aux=gcnew System::String(config->images_path); 
      aux=aux+"\\CAM_0\\Snap_0_0"+(this->comboBox_image1->SelectedIndex+1)+".bmp"; 
      System::IO::FileStream^ image_file=gcnew System::IO::FileStream(aux,System::IO::FileMode::Open,System::IO::FileAccess::Read); 
      System::Drawing::Bitmap^ img = gcnew System::Drawing::Bitmap(image_file); 
      this->pictureBox_image1->Image=img; 
      //img->~Bitmap(); this doesnt work, deletes the image of picturebox and makes the program chrash 
     } 

    } 
+1

你确定你有C++项目? – VladL 2013-03-11 09:44:09

+0

我们已经在您的Sample中看到了C#代码...确认编程语言.... – Pandian 2013-03-11 09:50:17

+0

@VladL对不起,刚刚从别处复制代码是因为我在编辑我的项目,但它并不完全正确。我有一个C++项目,不用担心。这个想法仍然是一样的。 – 2013-03-11 10:01:24

回答

3

你必须处置图像。如果忘记这么做,那么当垃圾收集器运行不够频繁时,您的程序可能会耗尽非托管内存。位图对象非常小,您可以在不触发GC的情况下分配数千个对象,但可以为像素数据消耗大量非托管内存。您使用删除运算符在C++/CLI中处理对象,它调用IDisposable :: Dispose()。

请注意,您使用的FileStream也是一次性对象。这样做需要您在位图正在使用时保持打开的流,然后关闭它。你正确地没有处理流,但忘记关闭它。太难以正确使用接受字符串作为文件路径的Bitmap构造函数,因此Bitmap类自己管理底层流更容易。修复:

aux = config->images_path; 
    aux += ....; 
    System::Drawing::Bitmap^ img = gcnew System::Drawing::Bitmap(aux); 
    delete this->pictureBox_image1->Image; 
    this->pictureBox_image1->Image = img; 
+0

非常感谢,我希望我能接受这两个答案。 – 2013-03-11 11:27:03

+0

按照您接受的答案中的建议,不要**调用image_file->关闭()。流**必须**保持打开,而位图可以被绘制。您确实非常想要支持Bitmap(String)构造函数。 – 2013-03-11 11:32:46

2

这不起作用,因为您试图调用类的析构函数,而不是实例。此外,由于System::Drawing::Bitmap在垃圾收集器的控制下,所以不需要调用它,因此如果不再引用终结器(!Bitmap()),它将自动调用。

如果你想关闭它在图片框,你可以做的是

delete this->pictureBox_image1->Image; 
image_file->Close(); //after closing/deleting the open bitmap 

BTW。你的代码是不是纯粹的C++,但C++/CLI,所以,我已经添加了标签

+0

我不能这样做。this-> pictureBox_image1-> Image = null;它说null没有被定义。相反,如果我写NULL它说,不能从int转换为图像... – 2013-03-11 11:14:07

+0

既不close()是System :: Drawing :: Bitmap的方法... – 2013-03-11 11:17:40

+0

@AnderBiguri似乎你是正确的,删除​​this-> pictureBox_image1 - >图片应该做的工作 – VladL 2013-03-11 11:18:13

0

首先设置一个空指针图像属性并刷新图片框下面给出,

pictureBox_image1->Image = nullptr; 
pictureBox_image1->Refresh();