当使用GetPixel或SetPixel方法在C#中获取或设置图像的亮度值时,速度变慢,因此,通常通过将按钮的LockBits设置为UnlockBits来获取或设置亮度。 进而比较了处理时间。

环境 
OS Windows10 64bit ver.1809
CPU Intel Core i7-7700K 4.2GHz
Memory 32GB
.NET Framework 4.5.2
平台 Any CPU (32Bit 优先)
评价影像 JPEG 6,000 x 4,000px 24bit Color

该测试使用了一个程序,该程序获取R,G,B中彩色图像的亮度值,然后反转强度值并再次替换它们。

  1. 处理结果如下:亮→暗→亮→暗。
  2. 处理时间:测量5次迭代的平均时间。

1. GetPixel, SetPixel的使用方法

Copy to Clipboard

2. 在LockBits~UnlockBits获取点(Scan0),复制并处理数据后,如何根据结果重新复制

Copy to Clipboard

3. 使用Marshal类的ReadByte和WriteByte方法,将值直接读取和写入指针(Scan0)

Copy to Clipboard

4. 如何直接使用Unsafe读取和写入指针(Scan0)

Copy to Clipboard

5. 如何使用指针进行读写以及如何使用Parallel.For并行处理

Copy to Clipboard

6. 加载之前处理的资料并使用的软件

Copy to Clipboard

结论

根据处理方式的处理时间

根据处理方法的处理时间因版本和Bit而异,如下所示。
当运行32Bit时,.NET Framework的4.5.2和4.7.2之间没有显着差异,但是在相同版本的.NET Framework中比较32bit和64Bit的操作,我们可以获得的结果为64Bit更快。

  1. .NET Framework 4.5.2 – 32Bit 基本

    方法  处理时间 (ms)
    GetPixel, SetPixel 27,439
     考虑使用LockBits和UnlockBits安排的处理 101
    Marshal系列的ReadByte, WriteByte 273.6
    Unsafe 用指针处理 25.4
    Unsafe 指针并行处理 11.4
  2. .NET Framework 4.7.2 – 32Bit 基本

    方法  处理时间 (ms)
    GetPixel, SetPixel 27,293.4
     考虑使用LockBits和UnlockBits安排的处理 101.8
    Marshal系列的ReadByte, WriteByte 290.8
    Unsafe 用指针处理 24.4
    Unsafe 指针并行处理 9.8
  3. .NET Framework 4.7.2 – 64bit 基本
    方法 处理时间 (ms)
    GetPixel, SetPixel 21,281.2
     考虑使用LockBits和UnlockBits安排的处理 85.4
    Marshal系列的ReadByte, WriteByte 213.6
    Unsafe 用指针处理 27.2
    Unsafe 指针并行处理 9.2

[注意事项]

  • 本博客的内容摘自总部位于AVALDATA的软件工程师Akira Yaskawa运营的博客(Imaging Solution.net)有关更多信息,请参阅Yaskawa先生的博客。
  • 对共享或引用此内容没有限制,但请避免未经授权的复制,修改,复制和商业使用。
  • 对上述材料的使用没有限制,但由于使用引起的错误由用户负责,因此请务必小心。