当使用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中彩色图像的亮度值,然后反转强度值并再次替换它们。
- 处理结果如下:亮→暗→亮→暗。
- 处理时间:测量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更快。
- .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 - .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 - .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先生的博客。
- 对共享或引用此内容没有限制,但请避免未经授权的复制,修改,复制和商业使用。
- 对上述材料的使用没有限制,但由于使用引起的错误由用户负责,因此请务必小心。