Odpowiednik metody scanline z Delphi w C#

0

Tak jak w temacie, czy istnieje w C# odpowiednik metody scanline dla obiektów typu bitmap, pictureBox, itd.? Np. mam linię kodu w Delphi, która wygląda następująco:

liniaObrazu := bitmap.scanline[i];

i chciałbym mięć w kodzie C# linię kodu, która da mi taki sam efekt.

0

i chciałbym mięć w kodzie C# linię kodu, która da mi taki sam efekt.
Nie, nie chciałbyś mieć linijki kodu, która da ci taki sam efekt; raczej chciałbyś mieć sposób na bezpośrednie odwołanie do pamięci bitmapy, prawda?

We właściwościach projektu włączyć „allow unsafe code”.

using System.Drawing.Imaging;
...
        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);

            BitmapData bd = bmp.LockBits(
                new Rectangle(0, 0, bmp.Width, bmp.Height),
                ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb
            );

            unsafe
            {
                byte* scanline = (byte*)bd.Scan0;
                for (int y = 0; y < bd.Height; y++)
                {
                    for (int x = 0; x < bd.Width; x++)
                    {
                        scanline[x * 4 + 0] = (byte)(x/2 + y/2);  // B
                        scanline[x * 4 + 1] = (byte)(172 - y/2);  // G
                        scanline[x * 4 + 2] = (byte)(255-x);      // R
                        scanline[x * 4 + 3] = 255;                // A
                    }
                    scanline += bd.Stride;
                }
            }

            bmp.UnlockBits(bd);
            pictureBox1.Image = bmp;
        }
    }

bd.Scan0 to wskaźnik na początek bitmapy. każda kolejna linia zaczyna się o bd.Stride bajtów dalej.
Bezpośrednim odpowiednikiem scanline[x] byłoby więc (byte*)bd.Scan0 + x * bd.Stride.

Pozwoliłem sobie jednak tak nie liczyć, a raczej w pętli inkrementować wskaźnik dla każdej linii.

2

żeby nie korzystać bezpośrednio z kodu unsafe i ominąć wiele ostrzeżeń, proponuję użyć klasy Marshal i metody ReadInt32 (wydajność taka sama)

1 użytkowników online, w tym zalogowanych: 0, gości: 1