Der Schritt wird immer von der vollständigen Bitmap sein, aber die Scan0-Eigenschaft unterscheidet sich je nach dem Startpunkt des Sperrrechtecks sowie der Höhe und Breite der BitmapData.
Der Grund dafür ist, dass Sie immer noch die tatsächliche Bitbreite der Bitmap kennen müssen, um über die Zeilen zu iterieren (add stride to address).
Ein einfacher Weg zu gehen darüber sei:
var bitmap = new Bitmap(100, 100);
var data = bitmap.LockBits(new Rectangle(0, 0, 10, 10),
ImageLockMode.ReadWrite,
bitmap.PixelFormat);
var pt = (byte*)data.Scan0;
var bpp = data.Stride/bitmap.Width;
for (var y = 0; y < data.Height; y++)
{
// This is why real scan-width is important to have!
var row = pt + (y * data.Stride);
for (var x = 0; x < data.Width; x++)
{
var pixel = row + x * bpp;
for (var bit = 0; bit < bpp; bit++)
{
var pixelComponent = pixel[bit];
}
}
}
bitmap.UnlockBits(data);
So ist es im Grunde wirklich nur die ganze Bitmap sperren, aber Ihnen einen Zeiger auf den linken oberen Pixel des Rechtecks in der Bitmap geben, und Einstellen der Breite und Höhe des Scans entsprechend.
Danke. Das macht Sinn! –
Es gibt keine Garantie, dass der Schritt der Bitmap gleich (Breite * Bytes pro Pixel) ist, also "var bpp = data.Stride/bitmap.Width;" ist falsch (Sie können leicht eine Bitmap mit einem anderen Schritt erstellen). Sie können (((Bitmap.Pixelformat) >> 8) & 255) verwenden, um die Anzahl der Bits pro Pixel oder (((Bitmap.Pixelformat) >> 11) & 31) für Bytes pro Pixel zu erhalten. –
Wenn Schritt für Sie wichtig ist, können Sie auch Ihren eigenen Puffer und Schritt mit ImageLockMode.UserInputBuffer liefern. –