要清除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)
{
}
}
}
您的代码有许多问题。
您要查找的问题是在加载新文件名之前没有清除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
的引用,再使用对Image
的Dispose
的引用,最后尝试加载新的引用。