在不丢失 pictureBox 的情况下处理 pictureBox 图像
Dispose of a pictureBox image without losing the pictureBox
我正在编写一个可以播放幻灯片(以及其他内容)的程序。幻灯片由 backgroundWorker 控制,并设置为 while(true) 循环,因此它将不断播放图像。我的问题是我不确定如何处理旧图像以免它们占用内存(一段时间后程序会抛出“内存不足异常”)。如果我调用 horPicBox.Image.Dispose() 那么它之后就不让我用pictureBox了。
有没有办法从内存中释放旧图像??如果我查看 VS 中的诊断工具,每次图像更改时内存都会增加......
注意:ImagePaths 是幻灯片图像的文件路径列表。
这是 backgroundWorker 运行的代码:
private void PlayImages()
{
Random r = new Random();
int index;
Stopwatch watch = new Stopwatch();
while (true)
{
index = r.Next(imagePaths.Count);
horPicBox.Image = Image.FromFile(imagePaths[index]);
watch.Start();
while (watch.ElapsedMilliseconds < 5000)
{
}
watch.Stop();
watch.Reset();
//picWorker.ReportProgress(0);
}
}
我可以向 UI 线程报告 progressChanged,但我不确定我需要从 UI 线程(如果有的话)做什么来释放旧图像。提前致谢!!
图像的数量和总大小是多少?我认为加载数组中的所有图像并将它们分配给 horPicBox
比多次加载它们更好。要使用 Dispose
,首先将 horPicBox.Image
分配给临时对象,然后将 horPicBox.Image
分配给 null
或下一张图像,并在最后为临时对象调用 Dispose
:
Image img = horPicBox.Image;
horPicBox.Image = Image.FromFile(imagePaths[index]);
if ( img != null ) img.Dispose();
如果您将图像存储到该类型的变量,然后设置您的图片框图像,然后像这样处理旧图像,会怎样
Image oldImage = horPicBox.Image;
horPicBox.Image = Image.FromFile(imagePaths[index]);
oldImage.Dispose();
我正在编写一个可以播放幻灯片(以及其他内容)的程序。幻灯片由 backgroundWorker 控制,并设置为 while(true) 循环,因此它将不断播放图像。我的问题是我不确定如何处理旧图像以免它们占用内存(一段时间后程序会抛出“内存不足异常”)。如果我调用 horPicBox.Image.Dispose() 那么它之后就不让我用pictureBox了。
有没有办法从内存中释放旧图像??如果我查看 VS 中的诊断工具,每次图像更改时内存都会增加......
注意:ImagePaths 是幻灯片图像的文件路径列表。
这是 backgroundWorker 运行的代码:
private void PlayImages()
{
Random r = new Random();
int index;
Stopwatch watch = new Stopwatch();
while (true)
{
index = r.Next(imagePaths.Count);
horPicBox.Image = Image.FromFile(imagePaths[index]);
watch.Start();
while (watch.ElapsedMilliseconds < 5000)
{
}
watch.Stop();
watch.Reset();
//picWorker.ReportProgress(0);
}
}
我可以向 UI 线程报告 progressChanged,但我不确定我需要从 UI 线程(如果有的话)做什么来释放旧图像。提前致谢!!
图像的数量和总大小是多少?我认为加载数组中的所有图像并将它们分配给 horPicBox
比多次加载它们更好。要使用 Dispose
,首先将 horPicBox.Image
分配给临时对象,然后将 horPicBox.Image
分配给 null
或下一张图像,并在最后为临时对象调用 Dispose
:
Image img = horPicBox.Image;
horPicBox.Image = Image.FromFile(imagePaths[index]);
if ( img != null ) img.Dispose();
如果您将图像存储到该类型的变量,然后设置您的图片框图像,然后像这样处理旧图像,会怎样
Image oldImage = horPicBox.Image;
horPicBox.Image = Image.FromFile(imagePaths[index]);
oldImage.Dispose();