Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Memanipulasi Peta Bit dengan Cekap dalam C#?

Bagaimanakah Saya Boleh Memanipulasi Peta Bit dengan Cekap dalam C#?

Patricia Arquette
Lepaskan: 2025-01-21 13:36:10
asal
413 orang telah melayarinya

How Can I Efficiently Manipulate Bitmaps in C#?

Pemprosesan bitmap pantas dalam C#

Apabila bekerja dengan peta bit yang besar, mengakses dan melaksanakan operasi pada asas piksel demi piksel boleh menjejaskan prestasi. Kaedah Bitmap.GetPixel() dan Bitmap.SetPixel() terbina dalam C# adalah mudah tetapi perlahan. Artikel ini meneroka cara alternatif untuk menukar peta bit kepada tatasusunan bait dengan cepat dan kembali kepada peta bit, membolehkan operasi piksel yang cekap.

Tukar bitmap kepada tatasusunan bait

  • Kaedah LockBits: Kaedah ini membenarkan akses terus kepada penimbal data dalaman bitmap. Dengan menggunakan kod tidak selamat, anda boleh mengakses data piksel mentah sebagai penunjuk, membolehkan operasi pantas. Walau bagaimanapun, pendekatan ini memerlukan pengurusan ingatan yang teliti.
  • Marshaling: Marshaling melibatkan penyalinan data antara memori terurus dan tidak terurus. Menggunakan kaedah Marshal.Copy() anda boleh menyalin data piksel daripada penimbal peta bit ke dalam tatasusunan bait. Walaupun marshaling tidak memerlukan kod yang tidak selamat, ia mungkin lebih perlahan daripada kaedah LockBits.

Tukar tatasusunan bait kepada peta bit

  • Kaedah LockBits: Selepas mengubah suai data piksel dalam tatasusunan bait, ia boleh disalin semula ke peta bit melalui kaedah LockBits. Ini serupa dengan menukar peta bit kepada tatasusunan bait.
  • Marshaling: Anda boleh menggunakan kaedah Marshal.Copy() untuk menyalin data piksel yang diubah suai daripada tatasusunan bait kembali ke penimbal peta bit.

Perbandingan prestasi

  • LockBits: lebih pantas, memerlukan kod tidak selamat
  • Marshaling: Lebih perlahan, tetapi tidak memerlukan kod tidak selamat

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

Contoh kaedah marshaling

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

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanipulasi Peta Bit dengan Cekap 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