哪个编解码器可以快速将位图保存到内存
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。
我正在将大量位图(屏幕截图)保存到内存中。代码没什么特别的,很简单:
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。