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

Which codec for saving bitmaps to memory fast

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

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

由于我的 PC 有点慢,我在 Visual Studio 中进行了 运行 性能分析会话,我发现 Save() 调用占用了 [=32] 的 37% =].另一个很大的部分是在保存到磁盘时使用的,所以这 37% 更可能是在不保存到磁盘时的 80%。 (我现在不关心保存到磁盘。所有数据都保存在 RAM 中,直到按下热键,我几乎不会影响硬盘速度。)

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

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

我试过:

ImageFormat.MemoryBmp

但这会引发 ArgumentNullException:

Value cannot be null. Parameter name: encoder

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

这些是在 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,但由于我不知道如何从 MagickImage 创建一个 Graphics 对象来保存屏幕截图,我不得不使用以 Bitmap 作为参数的构造函数。这导致 PNG 图像的负载约为 10.0% CPU。