private void LockBitmap()
{
if (_locked) throw new InvalidOperationException("Already locked");
Rectangle bounds = new Rectangle(0, 0, _bitmap.Width, _bitmap.Height);
// Figure out the number of bytes in a row. This is rounded up to be a multiple
// of 4 bytes, since a scan line in an image must always be a multiple of 4 bytes
// in length.
_width = bounds.Width * sizeof(PixelData);
if (_width % 4 != 0) _width = 4 * (_width / 4 + 1);
_bitmapData = _bitmap.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
_pBase = (byte*)_bitmapData.Scan0.ToPointer();
_locked = true;
}