Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh mempercepatkan Manipulasi Bitmap dalam C#?

Bagaimanakah saya boleh mempercepatkan Manipulasi Bitmap dalam C#?

Linda Hamilton
Lepaskan: 2025-01-21 13:41:09
asal
573 orang telah melayarinya

How Can I Speed Up Bitmap Manipulation in C#?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan