public SequentialEnumerator(LockableBitmapWrapper source) { if (source == null) { throw new ArgumentNullException("source"); } this.source = source; }
public IDictionary <int, List <ScanInfo> > Scan(Bitmap source) { LockableBitmap lockableBitmap = new LockableBitmap(source); lockableBitmap.LockBits(); LockableBitmapWrapper lockableBitmapWrapper = new LockableBitmapWrapper(lockableBitmap); try { SequentialEnumerator enumerator = new SequentialEnumerator(lockableBitmapWrapper); while (enumerator.MoveNext()) { AbcMask mask = enumerator.Current; if (mask.Current.Color.IsWhite()) { if (!mask.Left.IsLabeled && !mask.Top.IsLabeled) { if (regions.Count > 0) { mask.Current.RegionNumber = regions.Keys.Max() + 1; } else { mask.Current.RegionNumber = 0; } AddRegionAndMove( regionNumber: mask.Current.RegionNumber, info: mask.Current); } else if (!mask.Left.IsLabeled && mask.Top.IsLabeled) { mask.Current.RegionNumber = mask.Top.RegionNumber; Move(regionNumber: mask.Current.RegionNumber, info: mask.Current); } else if (mask.Left.IsLabeled && !mask.Top.IsLabeled) { mask.Current.RegionNumber = mask.Left.RegionNumber; Move(regionNumber: mask.Current.RegionNumber, info: mask.Current); } else if (mask.Left.IsLabeled && mask.Top.IsLabeled) { if (mask.Left.RegionNumber == mask.Top.RegionNumber) { mask.Current.RegionNumber = mask.Left.RegionNumber; Move(regionNumber: mask.Current.RegionNumber, info: mask.Current); } else { ReAllocate(mask); } } mask.Current.IsLabeled = true; } } } finally { lockableBitmap.UnlockBits(); } return(regions); }