你的程序是不是一边写,一边读?
嗯,算是,一台机子存截图,另外一台读取,实时监控嘛。
@雏菊之秋: 如果可以的话,用 MUTEX 隔离文件读/写操作。
@Launcher: 应该不是加锁的问题,因为只运行存截图这边,存的图片都是半张的,在资源浏览器里面大图标可以看到。
@雏菊之秋: 每 500 毫秒的 Save 的是一个新的文件名吗?
@Launcher: 不是新文件,存入同一个文件,不是会自动替换原有内容吗,我认为是更新这个文件了。
@雏菊之秋: 我这么跟你说吧,你别 500 毫秒保存一次,你就只保存一次,然后退出,然后看保存的图片是否正确。
@Launcher: 存一次是没有问题的,而且出现半张图的情况也是频率比较高,不是一直半张图的。
@雏菊之秋: 既然这样,那么请你每次存图片的时候都取一个新的名字,然后你看看有没有半张图片的。
@Launcher: 是有半张图情况的。我猜想可能是保存频率太高,但也不能再低了。
@雏菊之秋: 你是说每 500 毫秒存为一张新的图片(不是同一个文件名,是每次都是不同的文件名),也有半张图的情况?
@Launcher: 是的,就是这样。我是在Windows资源管理器的大图标看的图片,是有半张的情况。
@雏菊之秋: 那么每次保存时使用的 Bitmap 对象是新建的,还是只有一个?
@Launcher: 是新建的,从原有的 Bitmap 中 Clone 的。
@雏菊之秋: 然后你用了 LockBits,用 BitmapData 写入新图像的?
@Launcher:用了 ReaderWriterLock 的写入锁,保存是用的Bitmap.Save(string path)。
@雏菊之秋: 我问你,你如何将截图写入 Bitmap 对象的?
@Launcher:
using (Bitmap bitMap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height))
{
using (Graphics g = Graphics.FromImage(bitMap))
{
g.CopyFromScreen(0, 0, 0, 0, Screen.AllScreens[0].Bounds.Size);
}
bitMap.Save(path);
}
@雏菊之秋: 请问“是新建的,从原有的 Bitmap 中 Clone 的。” 这句话如何同你的代码对应上?
@Launcher: 其实是有两个Demo的,上面我贴出的代码是其中一个的主要几句,也是出现半张图的问题;另外一个Demo的Bitmap图片是利用了一个插件自动截取的,插件会返回一个Bitmap类型的截图,我就用 Clone 方法赋值一个Bitmap,然后Save。代码如下:
using (Bitmap saveBitmap = (Bitmap)eventArgs.Frame.Clone())
{
saveBitmap.Save(@"pic.png");
}
eventArgs 就是插件返回的参数,类型为Bitmap。
@Launcher: eventArgs.Frame 类型为Bitmap。不好意思刚写错了。
@雏菊之秋:
int i =0;
using (Bitmap bitMap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height))
{
using (Graphics g = Graphics.FromImage(bitMap))
{
g.CopyFromScreen(0, 0, 0, 0, Screen.AllScreens[0].Bounds.Size);
}
bitMap.Save(string.Format("D:\\pic\\{0}.jpg",i++));
}
你是说这段代码生成的图片中也有半张图的情况吗(注意,我每次都使用了新的文件名)?
@Launcher: 不好意思,我错了,这里的文件名我没有保证到每一个都不同,因为没精确到毫秒,少写了ff。我刚才测试发现如果文件名不同,那么不会发生半张图片的情况。
@Launcher: 用加锁的方法应该就可以解决我的问题了,感谢你的回答。