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
Patricia Arquetteasal
2025-01-21 13:36:10415semak imbas

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>

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>

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!

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