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

时间:2016-09-14 13:44:48

标签: c# performance bitmap image-compression

我将大量位图(屏幕截图)保存到内存中。没有什么特别的代码,它是微不足道的:

var memory = new MemoryStream();
bitmap.Save(memory, ImageFormat.Png);

由于我的PC速度有点慢,我在Visual Studio中运行了性能分析会话,我发现Save()调用需要37%的"包含样本"。保存到磁盘时使用另一个重要部分,因此当不保存到磁盘时,这些37%更可能是80%。 (我现在不关心保存到磁盘。所有数据都保存在RAM中,直到按下热键,我几乎没有影响硬盘速度。)

根据我的理解,Save()电话必须转换或多或少的" raw"将位图数据转换为压缩的PNG文件格式。

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

我试过了:

ImageFormat.MemoryBmp

但会引发ArgumentNullException

  

值不能为空。参数名称:encoder

我发现a related question描述了某些图像格式是只读的,这会略微减少列表。

1 个答案:

答案 0 :(得分:1)

这些是在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

我也尝试集成Magick.NET,但由于我无法弄清楚如何从Graphics创建MagickImage对象以保存屏幕截图,我不得不使用构造函数以Bitmap为参数。这导致PNG图像的CPU负载约为10.0%。