Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪个编解码器可以快速将位图保存到内存_C#_Performance_Bitmap_Image Compression - Fatal编程技术网

C# 哪个编解码器可以快速将位图保存到内存

C# 哪个编解码器可以快速将位图保存到内存,c#,performance,bitmap,image-compression,C#,Performance,Bitmap,Image Compression,我正在将大量位图(截图)保存到内存中。代码没有什么特别之处,很简单: var memory = new MemoryStream(); bitmap.Save(memory, ImageFormat.Png); 由于我的电脑速度有点慢,我在Visual Studio中运行了一个性能分析会话,发现Save()调用占用了37%的“包含样本”。另一个很大的部分是在保存到磁盘时使用的,所以这37%在不保存到磁盘时更有可能是80%。(我现在不在乎保存到磁盘。所有数据都保存在RAM中,直到按下热键,我几乎

我正在将大量位图(截图)保存到内存中。代码没有什么特别之处,很简单:

var memory = new MemoryStream();
bitmap.Save(memory, ImageFormat.Png);
由于我的电脑速度有点慢,我在Visual Studio中运行了一个性能分析会话,发现
Save()
调用占用了37%的“包含样本”。另一个很大的部分是在保存到磁盘时使用的,所以这37%在不保存到磁盘时更有可能是80%。(我现在不在乎保存到磁盘。所有数据都保存在RAM中,直到按下热键,我几乎不会影响硬盘速度。)

据我所知,
Save()
调用必须将位图的大致“原始”数据转换为压缩的PNG文件格式

我想知道是否有人对
Save()
方法的处理时间有不同图像格式的性能概述。我想选择最快的格式,即使文件大小更大

我试过:

ImageFormat.MemoryBmp
但这会引发一个
ArgumentNullException

值不能为null。参数名称:编码器


我发现它描述了一些图像格式是只读的,这将列表减少了一点。

这些是在Intel i7 CPU上拍摄3个监视器屏幕截图的非代表性结果,其中应用程序只分配了一个核心。我正在运行一个x64版本构建并保存到一个预先分配的内存缓冲区

GIF : ~5.5% CPU load
TIFF: ~4.5% CPU load
PNG : ~4.0% CPU load
JPG : ~2.0% CPU load (note that this is lossy)
BMP : ~1.0% CPU load

我也尝试了集成,但由于我无法想出如何从
MagickImage
创建
Graphics
对象以保存屏幕截图,因此我不得不使用以
位图
为参数的构造函数。这导致PNG图像的CPU负载约为10.0%。

粗略地说,压缩成本很高。因此,将图像保存到内存(或磁盘)的最快格式将是不涉及任何压缩的格式。可能……这取决于你没有提到的因素。如果问题是您需要在有限的时间内一个接一个地快速拍摄屏幕截图,那么您可以通过在RAM中累积屏幕截图,直到完成采集,然后在最后写入磁盘来做得更好。如果您的磁盘相对于CPU速度非常慢,则可能值得花时间压缩以减少磁盘I/O的容量。如果您的代码是串行和顺序的,则可能值得使用多线程,让一个线程获取图像,另一个线程并行地将其保存到磁盘。@MarkSetchell:我已经在这样做了。内存中有一个MemoryStream,不是吗?对不起,我只是泛泛而谈。我不知道你们环境的具体情况——事实上,我认为你们并没有提到语言或操作系统。@MarkSetchell:哦,的确如此。我忘了带C#标签。谢谢你的提示!过去某个地方有人做过与您类似的基准测试,目标是使用低规格硬件在一秒钟内编码几十幅图像。因此