Imagefrom.File()。内存不足异常

时间:2013-03-23 06:54:03

标签: c# winforms imagelist

我正在尝试在列表中加载大约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表单。感谢

2 个答案:

答案 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在评论中提到的那样,它可能也是另一种形式的错误,由于类中缺少错误消息而出现内存异常。