Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mempercepatkan Pemprosesan Bitmap dalam C# Menggunakan Kod Tidak Selamat atau 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!