如何将图像表单目录加载到pictureBox后删除图像文件后加载到图片框再次下载到下一个图像?

时间:2016-04-25 19:14:11

标签: c# .net winforms

int countimages = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {           
            Image img = sc.CaptureWindowToMemory(windowHandle);
            Bitmap bmp = new Bitmap(img,img.Width,img.Height);
            bmp.Save(@"e:\screenshotsofpicturebox1\screenshot" + countimages + ".bmp");
            bmp.Dispose();

            string[] images = Directory.GetFiles(@"e:\screenshotsofpicturebox1\", "*.bmp");
            if (images.Length > 0)
            {
                if (pictureBox1.Image != null)
                {
                    File.Delete(images[0]);
                    countimages = 0;
                    pictureBox1.Image.Dispose();
                }
                pictureBox1.Image = Image.FromFile(images[countimages]);
            }
            countimages += 1;
            label1.Text = countimages.ToString();
        }
  1. 我想将图像保存到硬盘
  2. 将图片加载到pictureBox1
  3. 将图像加载到pictureBox1后从硬盘中删除文件
  4. 将新图像保存到硬盘并将其加载到pictureBox1
  5. 每次使用新图像删除文件等。
  6. 现在的问题是我在线上遇到异常:

    File.Delete(images[0]);
    

    该进程无法访问文件e:\screenshotsofpicturebox1\screenshot0.bmp,因为它正由另一个进程使用。

    我现在看到的另一个问题是每次将新文件保存到硬盘

    screenshot0.bmp
    screenshot1.bmp
    

    但我希望每次只有一个文件screenshot0.bmp,并且每次都用新图片替换它。

1 个答案:

答案 0 :(得分:0)

阅读你的代码我假设你试图在每个tick事件的图片框中显示屏幕。 因此,如果这是您的目标,您不需要保存/删除它,只需将Image对象分配给PictureBox Image属性,如下所示:

private void timer1_Tick(object sender, EventArgs e) {
    Image refToDispose = pictureBox1.Image;
    pictureBox1.Image = sc.CaptureWindowToMemory(windowHandle);
    refToDispose.Dispose();
}

如果你想保存/删除它,你不能将直接加载的位图从文件传递到PictureBox,因为它会在使用时锁定文件。

相反,您可以使用图像大小从另一个Bitmap实例创建图形对象并绘制它,因此新的Bitmap将是一个没有可以分配给PictureBox的文件锁的副本。

在您的代码中更改此内容:

pictureBox1.Image = Image.FromFile(images[countimages]);

对此:

using (Image imgFromFile = Image.FromFile(images[countimages])) {
    Bitmap bmp = new Bitmap(imgFromFile.Width, imgFromFile.Height);
    using (Graphics g = Graphics.FromImage(bmp)) {
        g.DrawImage(imgFromFile, new Point(0, 0));
    }
    pictureBox1.Image = bmp;
}