public unsafe void CopyBlock(Rectangle block, ref byte[] dest) { int calc = 0; int WidthSize = block.Width * Info.PixelSize; int CopyOffset = 0; int scan0 = Scan0.ToInt32(); int destSize = WidthSize * block.Height; if (dest == null || dest.Length != destSize) { dest = new byte[destSize]; } calc = (block.Y) * Info.Stride + block.X * Info.PixelSize; fixed(byte *ptr = dest) { for (int i = 0; i < block.Height; i++) { NativeMethods.memcpy(new IntPtr(ptr + CopyOffset), new IntPtr(scan0 + calc), (uint)WidthSize); calc += Info.Stride; CopyOffset += WidthSize; } } }
public void Lock() { if (Locked) { throw new Exception("Already locked"); } lock (ProcessingLock) { bitmapData = bitMap.LockBits(new Rectangle(0, 0, bitMap.Width, bitMap.Height), ImageLockMode.ReadWrite, bitMap.PixelFormat); Info = new SimpleBitmapInfo(bitmapData); Scan0 = bitmapData.Scan0; Scan0_int = Scan0.ToInt32(); } }