首页 新闻 会员 周边

Bitmap.Save(string fileName)循环存入同一个文件,有时图片不完整

0
悬赏园豆:15 [已解决问题] 解决于 2015-03-11 17:47

功能具体为 实时截屏,存为一张图片,循环更新同一张图片,间隔为500毫秒。

经常出现截取的图片不完整的情况,半张图,不知道为什么。

 

求大神出现给解答一下,感激。

雏菊之秋的主页 雏菊之秋 | 初学一级 | 园豆:162
提问于:2015-03-11 15:44
< >
分享
最佳答案
0

你的程序是不是一边写,一边读?

收获园豆:15
Launcher | 高人七级 |园豆:45045 | 2015-03-11 15:48

嗯,算是,一台机子存截图,另外一台读取,实时监控嘛。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 15:50

@雏菊之秋: 如果可以的话,用 MUTEX 隔离文件读/写操作。

Launcher | 园豆:45045 (高人七级) | 2015-03-11 15:56

@Launcher: 应该不是加锁的问题,因为只运行存截图这边,存的图片都是半张的,在资源浏览器里面大图标可以看到。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 16:07

@雏菊之秋: 每 500 毫秒的 Save 的是一个新的文件名吗?

Launcher | 园豆:45045 (高人七级) | 2015-03-11 16:15

@Launcher: 不是新文件,存入同一个文件,不是会自动替换原有内容吗,我认为是更新这个文件了。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 16:16

@雏菊之秋: 我这么跟你说吧,你别 500 毫秒保存一次,你就只保存一次,然后退出,然后看保存的图片是否正确。

Launcher | 园豆:45045 (高人七级) | 2015-03-11 16:18

@Launcher: 存一次是没有问题的,而且出现半张图的情况也是频率比较高,不是一直半张图的。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 16:22

@雏菊之秋: 既然这样,那么请你每次存图片的时候都取一个新的名字,然后你看看有没有半张图片的。

Launcher | 园豆:45045 (高人七级) | 2015-03-11 16:23

@Launcher: 是有半张图情况的。我猜想可能是保存频率太高,但也不能再低了。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 16:31

@雏菊之秋: 你是说每 500 毫秒存为一张新的图片(不是同一个文件名,是每次都是不同的文件名),也有半张图的情况?

Launcher | 园豆:45045 (高人七级) | 2015-03-11 16:38

@Launcher: 是的,就是这样。我是在Windows资源管理器的大图标看的图片,是有半张的情况。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 16:41

@雏菊之秋: 那么每次保存时使用的 Bitmap 对象是新建的,还是只有一个?

Launcher | 园豆:45045 (高人七级) | 2015-03-11 16:43

@Launcher: 是新建的,从原有的 Bitmap 中 Clone 的。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 16:45

@雏菊之秋: 然后你用了 LockBits,用 BitmapData 写入新图像的?

Launcher | 园豆:45045 (高人七级) | 2015-03-11 16:50

@Launcher:用了 ReaderWriterLock 的写入锁,保存是用的Bitmap.Save(string path)。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 16:52

@雏菊之秋: 我问你,你如何将截图写入 Bitmap 对象的?

Launcher | 园豆:45045 (高人七级) | 2015-03-11 16:57

@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);
     }

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 17:06

@雏菊之秋: 请问“是新建的,从原有的 Bitmap 中 Clone 的。” 这句话如何同你的代码对应上?

Launcher | 园豆:45045 (高人七级) | 2015-03-11 17:11

@Launcher: 其实是有两个Demo的,上面我贴出的代码是其中一个的主要几句,也是出现半张图的问题;另外一个Demo的Bitmap图片是利用了一个插件自动截取的,插件会返回一个Bitmap类型的截图,我就用 Clone 方法赋值一个Bitmap,然后Save。代码如下:

using (Bitmap saveBitmap = (Bitmap)eventArgs.Frame.Clone())
{
    saveBitmap.Save(@"pic.png");

}

eventArgs 就是插件返回的参数,类型为Bitmap。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 17:17

@Launcher: eventArgs.Frame 类型为Bitmap。不好意思刚写错了。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 17:19

@雏菊之秋: 

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 | 园豆:45045 (高人七级) | 2015-03-11 17:23

@Launcher: 不好意思,我错了,这里的文件名我没有保证到每一个都不同,因为没精确到毫秒,少写了ff。我刚才测试发现如果文件名不同,那么不会发生半张图片的情况。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 17:38

@Launcher: 用加锁的方法应该就可以解决我的问题了,感谢你的回答。

雏菊之秋 | 园豆:162 (初学一级) | 2015-03-11 17:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册