要清除picturebox-c#中加载的图像

本文关键字:图像 加载 清除 picturebox-c# | 更新日期: 2023-09-27 18:06:50

最初,我将通过从组合框下拉列表中进行选择,将图像(比如20张图像(从指定文件夹加载到picturebox中,它们通常会加载到picture box中。

我面临的问题是,当我选择下一个文件夹来获取图像进行处理时,之前选择的文件夹图像也会在图片框中显示,在其计数后,只显示下一个文件夹图像,我无法清除之前加载的图像。

具体来说,当我从下拉列表中单击文件夹时,我希望特定文件夹的图像位于图片框中,我不希望之前加载的图像与它们一起。我使用c#在VS2013中工作。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        ArrayList alist = new ArrayList();
        int i = 0;
        int filelength = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DirectoryInfo di = new      DirectoryInfo(@"C:'Users'Arun'Desktop'scanned");
            DirectoryInfo[] folders = di.GetDirectories();
            comboBox1.DataSource = folders;
        }
        private void button7_Click(object sender, EventArgs e)
        {
            if (i + 1 < filelength)
            {
                pictureBox1.Image = Image.FromFile(alist[i + 1].ToString());
                i = i + 1;
                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            }
        }
        private void button8_Click(object sender, EventArgs e)
        {
            if (i - 1 >= 0)
            {
                pictureBox1.Image = Image.FromFile(alist[i - 1].ToString());
                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                i = i - 1;
            }
        }
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string selected = comboBox1.SelectedItem.ToString();
            String fullpath = Path.Combine(@"C:'Users'Arun'Desktop'scanned", selected);
            DirectoryInfo di1 = new DirectoryInfo(fullpath);
            DirectoryInfo[] folders1 = di1.GetDirectories();
            comboBox2.DataSource = folders1;
        }
        private void button9_Click(object sender, EventArgs e)
        {
            string selected1 = comboBox1.SelectedItem.ToString();
            string selected2 = comboBox2.SelectedItem.ToString();
                        //Initially load all your image files into the array list when form load first time
            System.IO.DirectoryInfo inputDir = new System.IO.DirectoryInfo(Path.Combine(@"C:'Users'Arun'Desktop'scanned", selected1, selected2)); //Source image folder path

            try
            {

                if ((inputDir.Exists))
                {
                    //Get Each files 
                    System.IO.FileInfo file = null;
                    foreach (System.IO.FileInfo eachfile in inputDir.GetFiles())
                    {
                        file = eachfile;
                        if (file.Extension == ".tif")
                        {
                            alist.Add(file.FullName); //Add it in array list
                            filelength = filelength + 1;
                        }
                        else if(file.Extension == ".jpg")
                        {
                            alist.Add(file.FullName); //Add it in array list
                            filelength = filelength + 1;
                        }
                    }
                    pictureBox1.Image = Image.FromFile(alist[0].ToString());  //Display intially first image in picture box as sero index file path
                    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                    i = 0;
                }
            }
            catch (Exception ex)
            {
            }
        }
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.D)
            {
                if (i + 1 < filelength)
                {
                    pictureBox1.Image = Image.FromFile(alist[i + 1].ToString());
                    i = i + 1;
                    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                }
            }
            else if(e.KeyCode == Keys.A)
            {
                if (i - 1 >= 0)
                {
                    pictureBox1.Image = Image.FromFile(alist[i - 1].ToString());
                    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                    i = i - 1;
                }
            }
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
        }
  }
}

要清除picturebox-c#中加载的图像

您的代码有许多问题。

您要查找的问题是在加载新文件名之前没有清除alist

因此插入:

    alist.Clear();

之前

    //Get Each files 

还有

   filelength = alist.Count;

循环之后。添加时无需计数!

还需要注意的是,ArrayList几乎是去缓存的,您应该使用类型安全且功能强大的List<T>

List<string> alist = new List<string>();

当然,一个名为i的类变量是愚蠢的,而且您还依赖于在comboBox2中始终有一个SelectedItem

由于您没有正确地处理映像,您正在泄漏GDI资源。

您可以使用此功能正确加载图像:

void loadImage(PictureBox pbox, string file)
{
    if (pbox.Image != null)
    {
        var dummy = pbox.Image;
        pbox.Image = null;
        dummy.Dispose();
    }
    if (File.Exists(file)) pbox.Image = Image.FromFile(file);
}

它首先创建对Image的引用,然后清除PictureBox的引用,再使用对ImageDispose的引用,最后尝试加载新的引用。