繁体   English   中英

使用 C# bitmap 更有效地将图像保存到磁盘

[英]Saving image to disk with C# bitmap more efficiently

我正在使用 C# 程序每秒保存大约 10 个大小为 660x330 的屏幕截图。

此 C# 程序用作游戏 GTA V 的 a.dll 脚本。

Bitmap catchBmp = new Bitmap(300, 660, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
Graphics g = Graphics.FromImage(catchBmp);
g.CopyFromScreen(new Point(Screen.AllScreens[0].Bounds.Width / 3 + 170, Screen.AllScreens[0].Bounds.Height / 6 + 60), new Point(0, 0), new Size(300, 660));
string tmp = Path.Combine(path, modNum.ToString(), location);
if (!Directory.Exists(tmp))
{
    Directory.CreateDirectory(tmp);
}
string tmp_filename = tmp + "\\" + location + "_" + weather + "_" + time + "_" + anim + "_" + view_angle + "_" + modNum + "_" + picNum.ToString() + ".jpg";
catchBmp.Save(tmp_filename);
UI.ShowSubtitle(tmp_filename);
Wait(100);
catchBmp.Dispose();
g.Dispose();      

上面的代码循环运行,每秒运行大约 10 次。

脚本运行大约 6 小时左右后,我的硬盘驱动器似乎达到了最大使用率并且脚本崩溃了。

有没有办法防止这种情况? 我想一次运行这个脚本几天。

使用线程保存图像会有帮助吗? 还是在将队列保存到磁盘时实现队列?

这似乎是磁盘跟不上的简单问题。

编辑:正如Nyerguds在评论中指出的那样,保存时需要指定图像格式,即catchBmp.Save(tmp_filename, ImageFormat.Jpeg); 否则将使用 png 压缩,这将需要更多的磁盘带宽。

一种选择是使用更有效的存储格式,即保存为可以使用帧之间的差异进行更好压缩的视频文件。 例如,参见aforge 中的视频写作 虽然这应该会减少正在写入的数据的大小,但会增加系统的 CPU 负载。

另一种选择是通过降低分辨率或调整压缩参数来降低图像文件的质量。 您还可以切换图像格式。 Jpeg 是一个旧标准,并且倾向于以低比特率产生低质量的图像,像jpeg xr这样的更现代的格式可能会更好。

第三种选择是简单地获得更快的磁盘,和/或确保程序对磁盘具有独占访问权限。

使用队列或线程可能不会有太大帮助,因为代码不会阻塞其他任何东西,它只会尽可能快地运行。 但是,我建议在 bitmap 之前处理图形,并在处理后移动等待。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM