Meningkatkan Prestasi Bitmap dalam C#
Untuk aplikasi yang menuntut kelajuan pemprosesan imej yang tinggi, mengoptimumkan manipulasi data piksel Bitmap adalah penting. Walaupun Bitmap.GetPixel()
dan Bitmap.SetPixel()
mencukupi untuk tugasan mudah, pengendalian imej besar atau pengubahsuaian yang kerap memerlukan pendekatan yang lebih cekap.
Akses Data Piksel Terus
Mengubah suai piksel individu dengan cekap melibatkan penukaran Peta Bit kepada tatasusunan bait. Ini paling baik dicapai menggunakan LockBits
atau marshaling.
Teknik LockBits
:
BitmapData.LockBits()
menyediakan penuding memori terus kepada data piksel, membolehkan akses pantas. Walau bagaimanapun, ini memerlukan penggunaan kod yang tidak selamat dan mengunci Bitmap secara eksplisit. Contoh:
<code class="language-csharp">unsafe Image ThresholdUA(Image image, float thresh) { Bitmap b = new Bitmap(image); BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); byte* scan0 = (byte*)bData.Scan0.ToPointer(); // Pixel manipulation loop using scan0 pointer... }</code>
Marshaling untuk Akses Selamat:
System.Runtime.InteropServices.Marshal.Copy()
menawarkan alternatif yang lebih selamat, memindahkan data piksel ke tatasusunan bait tanpa kod yang tidak selamat. Begini caranya:
<code class="language-csharp">Image ThresholdMA(Image image, float thresh) { Bitmap b = new Bitmap(image); BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; System.Runtime.InteropServices.Marshal.Copy(bData.Scan0, data, 0, size); // Pixel manipulation loop using data array... }</code>
Perbandingan Prestasi:
LockBits
secara amnya mengatasi prestasi marshaling kerana akses ingatannya secara langsung. Walau bagaimanapun, marshaling mengelakkan kod yang tidak selamat, menjadikannya lebih baik dalam konteks tertentu.
Kesimpulan:
Menukar Peta Bit kepada tatasusunan bait menggunakan LockBits
atau marshaling dengan ketara meningkatkan kecekapan manipulasi piksel, terutamanya untuk imej yang besar atau yang kerap diproses. Pilih kaedah yang paling mengimbangi prestasi dan keperluan keselamatan kod.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mempercepatkan Manipulasi Bitmap dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!