public void TestMethodBinOcrSaveLoad() { string tempFileName = Path.GetTempFileName(); var db = new BinaryOcrDb(tempFileName); var nbmp = new NikseBitmap(2, 2); nbmp.SetPixel(0, 0, Color.Transparent); nbmp.SetPixel(1, 0, Color.Transparent); nbmp.SetPixel(1, 0, Color.Transparent); nbmp.SetPixel(1, 1, Color.White); var bob = new BinaryOcrBitmap(nbmp); bob.Text = "Debug"; db.Add(bob); nbmp.SetPixel(0, 0, Color.White); var bob2 = new BinaryOcrBitmap(nbmp); bob2.X = 2; bob2.Y = 4; bob2.Text = "tt"; bob2.Italic = true; bob2.ExpandCount = 2; bob2.ExpandedList = new System.Collections.Generic.List<BinaryOcrBitmap>(); bob2.ExpandedList.Add(bob2); db.Add(bob2); db.Save(); db = new BinaryOcrDb(tempFileName, true); Assert.IsTrue(db.CompareImages.Count == 1); Assert.IsTrue(db.CompareImagesExpanded.Count == 1); Assert.IsTrue(bob.Width == db.CompareImages[0].Width); Assert.IsTrue(bob.Height == db.CompareImages[0].Height); Assert.IsTrue(bob.NumberOfColoredPixels == db.CompareImages[0].NumberOfColoredPixels); Assert.IsTrue(bob.Hash == db.CompareImages[0].Hash); Assert.IsTrue(bob.Italic == db.CompareImages[0].Italic); Assert.IsTrue(bob.ExpandCount == db.CompareImages[0].ExpandCount); Assert.IsTrue(bob.Text == db.CompareImages[0].Text); Assert.IsTrue(bob2.Width == db.CompareImagesExpanded[0].Width); Assert.IsTrue(bob2.Height == db.CompareImagesExpanded[0].Height); Assert.IsTrue(bob2.NumberOfColoredPixels == db.CompareImagesExpanded[0].NumberOfColoredPixels); Assert.IsTrue(bob2.Hash == db.CompareImagesExpanded[0].Hash); Assert.IsTrue(bob2.Italic == db.CompareImagesExpanded[0].Italic); Assert.IsTrue(bob2.ExpandCount == db.CompareImagesExpanded[0].ExpandCount); Assert.IsTrue(bob2.Text == db.CompareImagesExpanded[0].Text); Assert.IsTrue(bob2.X == db.CompareImagesExpanded[0].X); Assert.IsTrue(bob2.Y == db.CompareImagesExpanded[0].Y); try { File.Delete(tempFileName); } catch { } }
public Bitmap ToOldBitmap() { NikseBitmap nbmp = new NikseBitmap(Width, Height); for (int y = 0; y < Height; y++) { for (int x = 0; x < Width; x++) { nbmp.SetPixel(x, y, this.GetPixel(x, y)); } } return(nbmp.GetBitmap()); }
private static void RemoveBlackBarRight(NikseBitmap bmp) { int xRemoveBlackBar = bmp.Width - 1; for (int yRemoveBlackBar = 0; yRemoveBlackBar < bmp.Height; yRemoveBlackBar++) { byte[] c = bmp.GetPixelColors(xRemoveBlackBar, yRemoveBlackBar); if (c[0] == 0 || IsColorClose(c[0], c[1], c[2], c[3], Color.Black, 280)) { if (bmp.GetAlpha(xRemoveBlackBar - 1, yRemoveBlackBar) == 0) { bmp.SetPixel(xRemoveBlackBar, yRemoveBlackBar, Color.Transparent); } } } }
private static void RemoveBlackBarRight(NikseBitmap bmp) { int xRemoveBlackBar = bmp.Width - 1; for (int yRemoveBlackBar = 0; yRemoveBlackBar < bmp.Height; yRemoveBlackBar++) { Color c = bmp.GetPixel(xRemoveBlackBar, yRemoveBlackBar); if (c.A == 0 || IsColorClose(c, Color.Black, 280)) { if (bmp.GetPixel(xRemoveBlackBar - 1, yRemoveBlackBar).A == 0) { bmp.SetPixel(xRemoveBlackBar, yRemoveBlackBar, Color.Transparent); } } } }
private static void RemoveBlackBarRight(NikseBitmap bmp) { int xRemoveBlackBar = bmp.Width - 1; for (int yRemoveBlackBar = 0; yRemoveBlackBar < bmp.Height; yRemoveBlackBar++) { byte[] c = bmp.GetPixelColors(xRemoveBlackBar, yRemoveBlackBar); if (c[0] == 0 || IsColorClose(c[0], c[1], c[2], c[3], Color.Black, 280)) { if (bmp.GetAlpha(xRemoveBlackBar - 1, yRemoveBlackBar) == 0) bmp.SetPixel(xRemoveBlackBar, yRemoveBlackBar, Color.Transparent); } } }
private static List <ImageSplitterItem> SplitHorizontal(ImageSplitterItem verticalItem, int xOrMorePixelsMakesSpace) { // split line into letters NikseBitmap bmp = verticalItem.NikseBitmap; var parts = new List <ImageSplitterItem>(); int size = 0; int startX = 0; int lastEndX = 0; bool spaceJustAdded = false; for (int x = 0; x < bmp.Width - 1; x++) { int y; bool allTransparent = IsVerticalLineTransparent(bmp, out y, x); // check if line is transparent and cursive bool cursiveOk = false; int tempY; if (allTransparent == false && size > 5 && y > 3 && x < bmp.Width - 2 && !IsVerticalLineTransparent(bmp, out tempY, x + 1)) { //Add space? if (lastEndX > 0 && lastEndX + xOrMorePixelsMakesSpace < startX) { int cleanCount = 0; for (int j = lastEndX; j < startX; j++) { if (IsVerticalLineTransparentAlphaOnly(bmp, j)) { cleanCount++; } } if (cleanCount > 0 && !spaceJustAdded) { parts.Add(new ImageSplitterItem(" ")); spaceJustAdded = true; } } var cursivePoints = new List <Point>(); cursiveOk = IsCursiveVerticalLineTransparent(bmp, size, y, x, cursivePoints); if (cursiveOk) { // make letter image int end = x + 1 - startX; if (startX > 0) { startX--; end++; } NikseBitmap b1 = bmp.CopyRectangle(new Rectangle(startX, 0, end, bmp.Height)); // b1.Save(@"d:\temp\cursive.bmp"); // just for debugging // make non-black/transparent stuff from other letter transparent foreach (Point p in cursivePoints) { for (int fixY = p.Y; fixY < bmp.Height; fixY++) { b1.SetPixel(p.X - startX, fixY, Color.Transparent); } } RemoveBlackBarRight(b1); // b1.Save(@"d:\temp\cursive-cleaned.bmp"); // just for debugging // crop and save image int addY; b1 = CropTopAndBottom(b1, out addY); parts.Add(new ImageSplitterItem(startX, verticalItem.Y + addY, b1)); spaceJustAdded = false; size = 0; startX = x + 1; lastEndX = x; } } if (!cursiveOk) { if (allTransparent) { if (size > 0) { if (size > 1) { //Add space? if (lastEndX > 0 && lastEndX + xOrMorePixelsMakesSpace < startX) { int cleanCount = 0; for (int j = lastEndX; j < startX; j++) { if (IsVerticalLineTransparentAlphaOnly(bmp, j)) { cleanCount++; } } if (cleanCount > 2 && !spaceJustAdded) { parts.Add(new ImageSplitterItem(" ")); } } if (startX > 0) { startX--; } lastEndX = x; int end = x + 1 - startX; NikseBitmap part = bmp.CopyRectangle(new Rectangle(startX, 0, end, bmp.Height)); RemoveBlackBarRight(part); int addY; // part.Save("c:\\before" + startX.ToString() + ".bmp"); // just for debugging part = CropTopAndBottom(part, out addY); // part.Save("c:\\after" + startX.ToString() + ".bmp"); // just for debugging parts.Add(new ImageSplitterItem(startX, verticalItem.Y + addY, part)); spaceJustAdded = false; // part.Save(@"d:\temp\cursive.bmp"); // just for debugging } size = 0; } startX = x + 1; } else { size++; } } } if (size > 0) { if (lastEndX > 0 && lastEndX + xOrMorePixelsMakesSpace < startX && !spaceJustAdded) { parts.Add(new ImageSplitterItem(" ")); } if (startX > 0) { startX--; } lastEndX = bmp.Width - 1; int end = lastEndX + 1 - startX; NikseBitmap part = bmp.CopyRectangle(new Rectangle(startX, 0, end, bmp.Height - 1)); int addY; part = CropTopAndBottom(part, out addY); parts.Add(new ImageSplitterItem(startX, verticalItem.Y + addY, part)); //part.Save(@"d:\temp\cursive.bmp"); // just for debugging } return(parts); }
internal static ImageSplitterItem GetExpandedSelectionNew(NikseBitmap bitmap, List<ImageSplitterItem> expandSelectionList) { int minimumX = expandSelectionList[0].X; int maximumX = expandSelectionList[expandSelectionList.Count - 1].X + expandSelectionList[expandSelectionList.Count - 1].NikseBitmap.Width; int minimumY = expandSelectionList[0].Y; int maximumY = expandSelectionList[0].Y + expandSelectionList[0].NikseBitmap.Height; var nbmp = new NikseBitmap(bitmap.Width, bitmap.Height); foreach (ImageSplitterItem item in expandSelectionList) { for (int y = 0; y < item.NikseBitmap.Height; y++) { for (int x = 0; x < item.NikseBitmap.Width; x++) { int a = item.NikseBitmap.GetAlpha(x, y); if (a > 100) nbmp.SetPixel(item.X + x, item.Y + y, Color.White); } } if (item.Y < minimumY) minimumY = item.Y; if (item.Y + item.NikseBitmap.Height > maximumY) maximumY = item.Y + item.NikseBitmap.Height; } nbmp.CropTransparentSidesAndBottom(0, true); int topCropping; nbmp = NikseBitmapImageSplitter.CropTopAndBottom(nbmp, out topCropping); return new ImageSplitterItem(minimumX, minimumY, nbmp); }
public Bitmap ToOldBitmap() { NikseBitmap nbmp = new NikseBitmap(Width, Height); for (int y = 0; y < Height; y++) { for (int x = 0; x < Width; x++) { nbmp.SetPixel(x, y, this.GetPixel(x, y)); } } return nbmp.GetBitmap(); }
private static void RemoveBlackBarRight(NikseBitmap bmp) { int xRemoveBlackBar = bmp.Width-1; for (int yRemoveBlackBar = 0; yRemoveBlackBar < bmp.Height; yRemoveBlackBar++) { Color c = bmp.GetPixel(xRemoveBlackBar, yRemoveBlackBar); if (c.A == 0 || IsColorClose(c, Color.Black, 280)) { if (bmp.GetPixel(xRemoveBlackBar - 1, yRemoveBlackBar).A == 0) bmp.SetPixel(xRemoveBlackBar, yRemoveBlackBar, Color.Transparent); } } }
/// <summary> /// split into lines /// </summary> public static List <ImageSplitterItem> SplitToLinesNew(ImageSplitterItem item, int minLineHeight, double averageLineHeight = -1) { var bmp = new NikseBitmap(item.NikseBitmap); var parts = new List <ImageSplitterItem>(); bool started = false; var splitLines = new Dictionary <int, List <Point> >(); var startY = 0; for (int y = minLineHeight; y < bmp.Height - minLineHeight; y++) { if (startY == y && bmp.IsLineTransparent(y)) { startY++; continue; } var points = new List <Point>(); var yChange = 0; var completed = false; var backJump = 0; int x = 0; var maxUp = Math.Min(10, minLineHeight / 2); while (x < bmp.Width) { var a1 = bmp.GetAlpha(x, y + yChange); var a2 = bmp.GetAlpha(x, y + 1 + yChange); if (a1 > 150 || a2 > 150) { if (x > 1 && yChange < 8 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x, y + 2 + yChange) < 150 && bmp.GetAlpha(x, y + 3 + yChange) < 150) { yChange += 2; } else if (x > 1 && yChange < 8 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && bmp.GetAlpha(x, y + 3 + yChange) < 150 && bmp.GetAlpha(x, y + 4 + yChange) < 150) { yChange += 3; } else if (x > 1 && yChange < 7 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 4 + yChange) < 150 && bmp.GetAlpha(x - 1, y + 5 + yChange) < 150 && bmp.GetAlpha(x, y + 4 + yChange) < 150 && bmp.GetAlpha(x, y + 5 + yChange) < 150) { yChange += 4; } else if (x > 1 && yChange > -7 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x, y - 2 + yChange) < 150 && bmp.GetAlpha(x, y - 3 + yChange) < 150) { yChange -= 2; } else if (x > 1 && yChange > -7 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && bmp.GetAlpha(x, y - 3 + yChange) < 150 && bmp.GetAlpha(x, y - 4 + yChange) < 150) { yChange -= 3; } else if (x > 1 && yChange > -7 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y + yChange) < 150 && bmp.GetAlpha(x - 1, y - 1 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 2 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 3 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 4 + yChange) < 150 && bmp.GetAlpha(x - 1, y - 5 + yChange) < 150 && bmp.GetAlpha(x, y - 4 + yChange) < 150 && bmp.GetAlpha(x, y - 5 + yChange) < 150) { yChange -= 4; } else if (x > 10 && backJump < 3 && x > 5 && yChange > -7) // go left + up + check 12 pixels right { var done = false; for (int i = 1; i < maxUp; i++) { for (int k = 1; k < 9; k++) { if (CanGoUpAndRight(bmp, i, 12, x - k, y + yChange, minLineHeight)) { backJump++; x -= k; points.RemoveAll(p => p.X > x); done = true; yChange -= (i + 1); break; } } if (done) { break; } } if (!done) { started = true; break; } } else { started = true; break; } } if (started) { points.Add(new Point(x, y + yChange)); } completed = x == bmp.Width - 1; x++; } if (completed) { splitLines.Add(y, points); } } var transparentColor = Color.FromArgb(0, 0, 0, 0); foreach (var line in splitLines) { var key = line.Key; if (key - startY > minLineHeight && line.Value.Count > 0) { var maxY = line.Value.Max(p => p.Y); var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, maxY - startY)); //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_before.bmp"); foreach (var point in line.Value) { // delete down for (var y = point.Y - 1; y < startY + part.Height; y++) { part.SetPixel(point.X, y - startY, transparentColor); } } //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_after.bmp"); if (!part.IsImageOnlyTransparent() && part.GetNonTransparentHeight() >= minLineHeight) { var minY = line.Value.Min(p => p.Y); // bmp.GetBitmap().Save(@"j:\temp\main_" + parts.Count + "_before.bmp"); foreach (var point in line.Value) { // delete up for (var y = point.Y; y >= minY; y--) { bmp.SetPixel(point.X, y, transparentColor); } } // bmp.GetBitmap().Save(@"j:\temp\main_" + parts.Count + "_after.bmp"); // part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + "_after.bmp"); var croppedTop = part.CropTopTransparent(0); parts.Add(new ImageSplitterItem(0 + item.X, startY + croppedTop + item.Y, part)); startY = key + 1; } } } if (bmp.Height - startY > 1 && parts.Count > 0) { var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, bmp.Height - startY)); if (!part.IsImageOnlyTransparent()) { //part.GetBitmap().Save(@"j:\temp\split_" + parts.Count + ".bmp"); var croppedTop = part.CropTopTransparent(0); parts.Add(new ImageSplitterItem(0 + item.X, startY + croppedTop + item.Y, part)); } } if (parts.Count <= 1) { return(new List <ImageSplitterItem> { item }); } return(parts); }
private static void RemoveBlackBarRight(NikseBitmap bmp) { int xRemoveBlackBar = bmp.Width - 1; for (int yRemoveBlackBar = 0; yRemoveBlackBar < bmp.Height; yRemoveBlackBar++) { byte[] colors = bmp.GetPixelColors(xRemoveBlackBar, yRemoveBlackBar); if (colors[0] != 0 && !IsColorClose(colors[0], colors[1], colors[2], colors[3], Color.Black, 280)) { continue; } if (bmp.GetAlpha(xRemoveBlackBar - 1, yRemoveBlackBar) == 0) { bmp.SetPixel(xRemoveBlackBar, yRemoveBlackBar, Color.Transparent); } } }