我正在尝试在列表中加载大约60张图片。每张图片大约1MB。对于20张图片没有问题,但在上面的代码行上我得到内存不足异常。我搜索了大量相关问题,其中一些说明"使用"关键词和流,但因为我是初学者,有人可以帮助我。
Image image = Bitmap.FromFile(Filename);
这是我的代码
private void LoadBtn_Click_1(object sender, EventArgs e)
{
OpenFileDialog newDialog = new OpenFileDialog();
if (newDialog.ShowDialog() == DialogResult.OK)
{
images.Clear();
string dirPath = System.IO.Path.GetDirectoryName(newDialog.FileName.ToLower());
DirectoryInfo di = new DirectoryInfo(dirPath);
FileInfo[] finfos = di.GetFiles("*.*");
foreach (FileInfo fi in finfos)
{
string ext = fi.Extension.ToLower();
if ((ext.Equals(".png")) || (ext.Equals(".jpg")) || (ext.Equals(".tif")) || (ext.Equals(".gif")))
{
string Filename = fi.FullName;
Image image = Bitmap.FromFile(Filename); //exception occurs HERE
images.Add(image);
//this.imageList1.Images.Add(image);
//image.Dispose();
}
}
}
pictureBox3.Image = images[0];
}
我正在使用C#,windows表单。感谢
答案 0 :(得分:1)
在看了你提到的软件后,正如我告诉你的那样,如果你只需要一个缩略图,就不需要将整个图像加载到内存中。
所以我创建了我的课程
class ImageAndThumb
{
public Image Thumb;
public Image Big;
private string ImagePath;
public ImageAndThumb(string fileName)
{
ImagePath = fileName;
Image image = Image.FromFile(fileName)
Image thumb = img.GetThumbnailImage(200, 200, ()=>false, IntPtr.Zero);
}
public Image LoadBigImage()
{
Big = Image.FromFile(ImagePath);
return Big;
}
public void UnloadImage()
{
Big = null;
}
}
现在我们使用那个类:
List<ImageAndThumb> Images = new List<ImageAndThumb>();
private void LoadBtn_Click_1(object sender, EventArgs e)
{
OpenFileDialog newDialog = new OpenFileDialog();
if (newDialog.ShowDialog() == DialogResult.OK)
{
Images.Clear();
string dirPath = System.IO.Path.GetDirectoryName(newDialog.FileName.ToLower());
DirectoryInfo di = new DirectoryInfo(dirPath);
FileInfo[] finfos = di.GetFiles("*.*");
foreach (FileInfo fi in finfos)
{
string ext = fi.Extension.ToLower();
if ((ext.Equals(".png")) || (ext.Equals(".jpg")) || (ext.Equals(".tif")) || (ext.Equals(".gif")))
{
string Filename = fi.FullName;
ImageAndThumb image = new ImageAndThumb(Filename);
Images.Add(image);
}
}
}
pictureBox3.Image = Images[0].Thumb; // << Much less memory usage;
}
现在,无论何时需要使用图像,首先加载它 例如:
void ShowPicture(int index)
{
Images[index].LoadBigImage();
PictureBoxBig.image = Images[index].Big;
}
void ClosePicture(int index)
{
Images[index].UnloadImage();
}
一个好主意是在加载另一个图像后卸载图像:
int currentPictureIndex = -1;
void ShowPicture(int index)
{
Images[index].LoadBigImage();
PictureBoxBig.image = Images[index].Big;
if(CurrentPictureIndex > -1) ClosePicture(CurrentPictureIndex);
currentPictureIndex = index;
}
答案 1 :(得分:0)
首先,你的内存不足吗?因为如果你那么错误是有效的。
如果你的内存不足,你需要做的第一件事是将你的foreach循环中的代码包装在try / catch块中,如下所示:
foreach (FileInfo fi in finfos)
{
string ext = fi.Extension.ToLower();
if ((ext.Equals(".png")) || (ext.Equals(".jpg")) || (ext.Equals(".tif")) || (ext.Equals(".gif")))
{
try
{
string Filename = fi.FullName;
Image image = Bitmap.FromFile(Filename); //exception occurs HERE
images.Add(image);
//this.imageList1.Images.Add(image);
//image.Dispose();
}
catch {}
}
}
原因是,正如Jason Watkins在评论中提到的那样,它可能也是另一种形式的错误,由于类中缺少错误消息而出现内存异常。