提高 C# 中的位图处理速度
使用 GetPixel()
和 SetPixel()
在 C# 位图中直接进行像素操作可能会很慢。 为了显着加快处理速度,将位图转换为字节数组可通过提供对像素数据的直接访问来提供性能优势。
位图到字节数组的转换
此方法有效地将 Bitmap 转换为表示每个像素的 RGBA 数据的字节数组:
<code class="language-csharp">public static byte[] BitmapToByteArray(Bitmap bitmap) { BitmapData bData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); int length = bData.Stride * bData.Height; byte[] data = new byte[length]; System.Runtime.InteropServices.Marshal.Copy(bData.Scan0, data, 0, length); bitmap.UnlockBits(bData); return data; }</code>
字节数组到位图重建
此函数从字节数组重建位图:
<code class="language-csharp">public static Bitmap ByteArrayToBitmap(byte[] data, int width, int height) { Bitmap bitmap = new Bitmap(width, height); BitmapData bData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); System.Runtime.InteropServices.Marshal.Copy(data, 0, bData.Scan0, data.Length); bitmap.UnlockBits(bData); return bitmap; }</code>
理解LockBits
和Marshal.Copy
LockBits()
将位图的像素数据保护在内存中以便直接访问。 Marshal.Copy()
促进托管(C#)和非托管(位图内存)内存空间之间的高效数据传输。
编组与不安全代码
虽然不安全的代码可能提供更快的执行速度,但它需要细致的处理。 编组提供了一种更安全的替代方案,尽管潜在的性能损失很小。最佳选择取决于您项目的具体需求和风险承受能力。
以上是如何使用字节数组加速 C# 中的位图操作?的详细内容。更多信息请关注PHP中文网其他相关文章!