我使用c#进行了幻灯片放映,代码运行良好并没有给我任何错误,但是当我在30-60秒后点击播放按钮时它会停止并让我内存不足Exception System.Drawing.dll。有什么想法解决这个问题吗?谢谢
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Slide_Show
{
public partial class SlideShow : Form
{
public SlideShow()
{
InitializeComponent();
if (timer.Interval < 200)
{
timer.Interval = 100;
}
else if(timer.Interval > 8000)
{
timer.Interval = 600;
}
else{
timer.Interval = 2000;
}
}
string dir;
private void btnImagesSelection_Click(object sender, EventArgs e)
{
FolderBrowserDialog asked = new FolderBrowserDialog();
if (asked.ShowDialog() == DialogResult.OK)
{
string folName = asked.SelectedPath;
foreach (string fullfol in Directory.GetFiles(folName))
{
dir = fullfol.Substring(0, fullfol.LastIndexOf(("\\")));
picImages.Image = Image.FromFile(fullfol);
lstImages.Items.Add(Path.GetFileName(fullfol));
lblNum.Text = lstImages.Items.Count.ToString() + "/" + lstImages.Items.Count.ToString();
}
}
}
private void lstImages_SelectedIndexChanged(object sender, EventArgs e)
{
string curitem = lstImages.SelectedItem.ToString();
picImages.Image = Image.FromFile(dir+"\\"+curitem);
lblNum.Text = (lstImages.SelectedIndex+1).ToString() + "/" + lstImages.Items.Count.ToString();
}
bool flip = true;
int i = 0;
private void btnPlay_Click(object sender, EventArgs e)
{
timer.Start();
timer.Interval = 1000;
timer.Tick += new EventHandler(timetick);
}
void timetick(object sender, EventArgs e)
{
int numitems = lstImages.Items.Count;
if (flip)
if (i < numitems)
{
try
{
lblNum.Text = (i + 1) + "/" + numitems;
picImages.Image = Image.FromFile(dir + "\\" + lstImages.Items[i].ToString());
i += 1;
}
catch
{
timer.Stop();
}
}
else if (i == numitems)
{
i = 0;
}
flip = !flip;
}
private void btnSlow_Click(object sender, EventArgs e)
{
try
{
timer.Interval *= 2;
}
catch
{
timer.Interval = 6000;
}
}
private void btnFast_Click(object sender, EventArgs e)
{
try
{
timer.Interval /= 2;
}
catch
{
timer.Interval = 100;
}
}
private void btnStop_Click(object sender, EventArgs e)
{
timer.Stop();
}
}
}
答案 0 :(得分:2)
Image
类将图像数据保存为非托管资源。 Garbage Collector
无法卸载这些资源,当您调用Dispose
方法或finalization时,内存将被释放。最终化速度太慢,无法处理大量图像,所以每次加载新图像时都应该处理旧图像。
private void LoadNewImage(string path)
{
var oldImage = picImages.Image;
picImages.Image = Image.FromFile(dir+"\\"+curitem);
if(oldImage!= null)
{
oldImage.Dispose();
}
}