C#中快速位图处理
处理大型位图时,逐像素访问和执行操作可能会影响性能。C#内置的Bitmap.GetPixel()
和Bitmap.SetPixel()
方法虽然方便,但速度较慢。本文探讨了将位图快速转换为字节数组并转换回位图的替代方法,从而实现高效的像素操作。
位图转换为字节数组
Marshal.Copy()
方法,您可以将像素数据从位图缓冲区复制到字节数组中。虽然封送处理不需要不安全代码,但它可能比LockBits方法略慢。字节数组转换为位图
Marshal.Copy()
方法将修改后的像素数据从字节数组复制回位图缓冲区。性能比较
LockBits方法示例
<code class="language-csharp">using System; using System.Drawing; using System.Runtime.InteropServices; public unsafe class FastBitmap { public static Image ThresholdUA(float thresh) { Bitmap b = new Bitmap(_image); BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); byte* scan0 = (byte*)bData.Scan0.ToPointer(); for (int i = 0; i < ... }</code>
封送处理方法示例
<code class="language-csharp">using System; using System.Drawing; using System.Runtime.InteropServices; public class FastBitmap { public static Image ThresholdMA(float thresh) { Bitmap b = new Bitmap(_image); BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; Marshal.Copy(bData.Scan0, data, 0, size); for (int i = 0; i < ... }</code>
以上是如何在 C# 中高效地操作位图?的详细内容。更多信息请关注PHP中文网其他相关文章!