首頁 >後端開發 >C++ >如何在 C# 中有效率地操作點陣圖?

如何在 C# 中有效率地操作點陣圖?

Patricia Arquette
Patricia Arquette原創
2025-01-21 13:36:10415瀏覽

How Can I Efficiently Manipulate Bitmaps in C#?

C#中快速位圖處理

處理大型點陣圖時,逐像素存取和執行操作可能會影響效能。 C#內建的Bitmap.GetPixel()Bitmap.SetPixel()方法雖然方便,但速度較慢。本文探討了將位圖快速轉換為位元組數組並轉換回位圖的替代方法,從而實現高效的像素操作。

點陣圖轉換為位元組數組

  • LockBits方法: 此方法允許直接存取位圖的內部資料緩衝區。透過使用不安全程式碼,您可以將原始像素資料作為指標訪問,從而實現快速操作。但是,這種方法需要仔細管理記憶體。
  • 封送處理: 封送處理涉及在託管記憶體和非託管記憶體之間複製資料。使用Marshal.Copy()方法,您可以將像素資料從點陣圖緩衝區複製到位元組數組中。雖然封送處理不需要不安全程式碼,但它可能比LockBits方法略慢。

位元組數組轉換為點陣圖

  • LockBits方法: 修改位元組數組中的像素資料後,可以透過LockBits方法將其複製回位圖。這與將點陣圖轉換為位元組數組的過程類似。
  • 封送處理: 您可以使用Marshal.Copy()方法將修改後的像素資料從位元組數組複製回點陣圖緩衝區。

效能比較

  • LockBits: 更快,需要不安全程式碼
  • 封送處理: 較慢,但不需要不安全程式碼

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn