Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mempercepatkan Pemprosesan Bitmap dalam C# Menggunakan Kod Tidak Selamat atau Marshaling?

Bagaimanakah Saya Boleh Mempercepatkan Pemprosesan Bitmap dalam C# Menggunakan Kod Tidak Selamat atau Marshaling?

Patricia Arquette
Patricia Arquetteasal
2025-01-21 13:47:09238semak imbas

How Can I Speed Up Bitmap Processing in C# Using Unsafe Code or Marshaling?

Mengoptimumkan Pemprosesan Peta Bit dalam C#

Pengenalan

Untuk tugas pemprosesan imej, pengendalian data piksel yang cekap dalam objek Bitmap adalah penting. Walau bagaimanapun, kaedah Bitmap.GetPixel() dan Bitmap.SetPixel() standard boleh menjadi sangat perlahan apabila berurusan dengan imej besar. Artikel ini meneroka teknik untuk meningkatkan prestasi secara dramatik dengan menukar data Peta Bit ke dan dari tatasusunan bait dengan cekap.

Peta Bit Kelajuan Tinggi kepada Penukaran ByteArray: Kod Tidak Selamat

Kod tidak selamat menawarkan akses memori terus, membolehkan manipulasi data piksel mentah yang lebih pantas. Dengan menggunakan BitmapData dan LockBits, anda boleh mendapatkan penunjuk ke garis imbasan pertama Bitmap. Aritmetik penunjuk kemudian membenarkan lelaran yang cekap melalui setiap piksel, mengakses komponen bait RGB individu.

Contoh Kod Tidak Selamat:

<code class="language-csharp">public unsafe 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();

    // ... pixel processing using pointer arithmetic ...

    b.UnlockBits(bData);
    return b;
}</code>

Peta Bit Terurus kepada Penukaran ByteArray: Marshaling

Marshaling menyediakan alternatif yang lebih selamat dan terurus untuk menukar data Bitmap kepada tatasusunan bait. Marshal.Copy() menyalin data piksel dengan cekap daripada BitmapData.Scan0 penuding kepada tatasusunan bait yang telah diperuntukkan sebelumnya. Selepas pemprosesan, data yang diubah suai disalin semula menggunakan kaedah yang sama.

Contoh Marshaling:

<code class="language-csharp">public 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);
    int size = bData.Stride * bData.Height;
    byte[] data = new byte[size];
    Marshal.Copy(bData.Scan0, data, 0, size);

    // ... process byte array data ...

    Marshal.Copy(data, 0, bData.Scan0, data.Length);
    b.UnlockBits(bData);
    return b;
}</code>

Analisis Prestasi

Pilihan optimum antara kod tidak selamat dan marshaling bergantung pada keperluan prestasi aplikasi anda. Kod tidak selamat menawarkan kelajuan yang lebih tinggi tetapi memerlukan pengendalian yang teliti untuk mengelakkan ralat memori. Marshaling adalah lebih selamat tetapi kurang berprestasi. Kaedah terbaik harus dipilih berdasarkan permintaan khusus projek anda.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mempercepatkan Pemprosesan Bitmap dalam C# Menggunakan Kod Tidak Selamat atau Marshaling?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn