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.