Soweit ich weiß, gibt es kein Konzept für Zeiger in einer verwalteten Umgebung, in der Garbage Collector für die Speicherverwaltung zuständig ist. Wenn jemand die Pixelwerte in einer Bitmap manipulieren möchte, muss er zuerst wie im folgenden Code sperren.Warum ist Bitmap Scan0 nach dem Entsperren noch gültig?
Bitmap Image = new Bitmap(width, height,
System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
Rectangle rect = new Rectangle(0, 0, width, height);
BitmapData bmpData = Image.LockBits(rect, ImageLockMode.ReadWrite,
PixelFormat.Format8bppIndexed);
IntPtr imageScan0 = bmpData.Scan0;
unsafe
{
byte* ptr = (byte*)imageScan0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
*ptr++ = 128;
}
}
}
Image.UnlockBits(bmpData);
Mein Hauptproblem ist, dass: Wenn ich die imageScan0 Informationen speichern und dann die Bitmap entsperren, ich immer noch die imageScan0 können ihre Werte zu manipulieren, so wie ich es zwischen Schloss zu manipulieren und Operationen entsperren.
Ich habe es getestet und ich bin überrascht zu sehen, dass ImageScan0 noch gültig ist, um zu manipulieren. Meine Vermutung ist, dass die zugrunde liegende Bitmap im nicht verwalteten Speicher residiert.
Natürlich ist es möglich, nach UnlockBits zu manipulieren, aber es ist nicht garantiert. Es kann oder darf nicht. –