SetPixel
和 GetPixel
经常用于 Windows 窗体中的像素级位图操作,但它们的性能非常差,特别是对于较大的图像或频繁的操作。 本文探讨了更快的替代方案。
DirectBitmap 类
一个高效的解决方案是 DirectBitmap
类。 此类利用固定内存,无需使用 LockBits
或 SetPixel
即可直接访问位图数据。 这种对原始位图数据的直接访问显着提高了性能。
基于字节的原始像素数据
可以通过将原始像素数据表示为字节而不是整数来实现进一步的优化。这会将数据格式转换为 ARGB(Alpha/Red/Green/Blue),每个像素消耗 4 个字节。 这需要相应地调整 GetPixel
和 SetPixel
函数。
使用 DirectBitmap
类具有以下主要优势:
IDisposable
,类似于Bitmap
,最大限度地减少对象管理开销。unsafe
代码块。DirectBitmap
使用的固定内存有一个限制:它是不可移动的。固定内存访问的这种固有特征会影响垃圾收集效率。 因此,仅在性能至关重要时才明智地使用此技术,并始终确保正确处理以解锁内存。
尽管 DirectBitmap
提供了直接访问,Graphics
对象仍然是位图操作的可行工具。
DirectBitmap
、LockBits
和 SetPixel
的比较揭示了巨大的性能差异,特别是对于较大的图像:
Method | 4x4 | 16x16 | 64x64 | 256x256 | 1024x1024 | 4096x4096 |
---|---|---|---|---|---|---|
DirectBitmap | 2 | 28 | 668 | 8219 | 178639 | |
LockBits | 2 | 3 | 33 | 670 | 9612 | 197115 |
SetPixel | 45 | 371 | 5920 | 97477 | 1563171 | 25811013 |
DirectBitmap
类明显优于 LockBits
和 SetPixel
,特别是在处理较大图像时。
以上是如何加快 Windows 窗体应用程序中的像素操作?的详细内容。更多信息请关注PHP中文网其他相关文章!