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();
}
现在的问题是我在线上遇到异常:
File.Delete(images[0]);
该进程无法访问文件e:\screenshotsofpicturebox1\screenshot0.bmp
,因为它正由另一个进程使用。
我现在看到的另一个问题是每次将新文件保存到硬盘
screenshot0.bmp
screenshot1.bmp
但我希望每次只有一个文件screenshot0.bmp
,并且每次都用新图片替换它。
答案 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;
}