mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-11-25 20:52:44 +01:00
Initial work on new OCR line splitter
This commit is contained in:
parent
eefea2601d
commit
34102f0dac
BIN
Ocr/Latin.nocr
BIN
Ocr/Latin.nocr
Binary file not shown.
@ -1344,6 +1344,18 @@ namespace Nikse.SubtitleEdit.Core
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsImageOnlyTransparent()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < _bitmapData.Length; i += 4)
|
||||||
|
{
|
||||||
|
if (_bitmapData[i] != 0) // check alpha
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void EnsureEvenLines(Color fillColor)
|
public void EnsureEvenLines(Color fillColor)
|
||||||
{
|
{
|
||||||
if (Width % 2 == 0 && Height % 2 == 0)
|
if (Width % 2 == 0 && Height % 2 == 0)
|
||||||
|
@ -6368,8 +6368,6 @@ namespace Nikse.SubtitleEdit.Forms.Ocr
|
|||||||
_selectedIndex = -1;
|
_selectedIndex = -1;
|
||||||
textBoxCurrentText.Text = string.Empty;
|
textBoxCurrentText.Text = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
MakeHorizontalSplit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SelectedIndexChangedAction()
|
private void SelectedIndexChangedAction()
|
||||||
@ -6590,116 +6588,6 @@ namespace Nikse.SubtitleEdit.Forms.Ocr
|
|||||||
e.SuppressKeyPress = true;
|
e.SuppressKeyPress = true;
|
||||||
MakeHorizontalSplit();
|
MakeHorizontalSplit();
|
||||||
}
|
}
|
||||||
else if (e.Modifiers == (Keys.Control | Keys.Shift) && e.KeyCode == Keys.H && (_ocrMethodIndex == _ocrMethodBinaryImageCompare || _ocrMethodIndex == _ocrMethodNocr))
|
|
||||||
{
|
|
||||||
e.SuppressKeyPress = true;
|
|
||||||
var random = new Random();
|
|
||||||
var bmp = (Bitmap)pictureBoxSubtitleImage.Image;
|
|
||||||
if (bmp != null)
|
|
||||||
{
|
|
||||||
var nBmp = new NikseBitmap(bmp);
|
|
||||||
bmp.Dispose();
|
|
||||||
bool started = false;
|
|
||||||
for (int y = 12; y < nBmp.Height - 15; y++)
|
|
||||||
{
|
|
||||||
var points = new List<Point>();
|
|
||||||
var yChange = 0;
|
|
||||||
var c = Color.FromArgb(255, random.Next(200) + 55, random.Next(200) + 55, random.Next(200) + 55);
|
|
||||||
var completed = false;
|
|
||||||
|
|
||||||
int x = nBmp.Width - 1;
|
|
||||||
while (x > 0)
|
|
||||||
{
|
|
||||||
var a1 = nBmp.GetAlpha(x, y + yChange);
|
|
||||||
var a2 = nBmp.GetAlpha(x, y + 1 + yChange);
|
|
||||||
if (a1 > 150 || a2 > 150)
|
|
||||||
{
|
|
||||||
if (x > 1 && yChange < 8 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + yChange) < 150 && nBmp.GetAlpha(x + 1, y + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 1 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 2 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 2 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 3 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x, y + 2 + yChange) < 150 && nBmp.GetAlpha(x, y + 3 + yChange) < 150)
|
|
||||||
{
|
|
||||||
yChange += 2;
|
|
||||||
}
|
|
||||||
else if (x > 1 && yChange < 8 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + yChange) < 150 && nBmp.GetAlpha(x + 1, y + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 1 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 2 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 2 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 3 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 3 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 4 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x, y + 3 + yChange) < 150 && nBmp.GetAlpha(x, y + 4 + yChange) < 150)
|
|
||||||
{
|
|
||||||
yChange += 3;
|
|
||||||
}
|
|
||||||
else if (x > 1 && yChange < 7 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + yChange) < 150 && nBmp.GetAlpha(x + 1, y + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 1 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 2 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 2 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 3 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 3 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 4 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + 4 + yChange) < 150 && nBmp.GetAlpha(x + 1, y + 5 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x, y + 4 + yChange) < 150 && nBmp.GetAlpha(x, y + 5 + yChange) < 150)
|
|
||||||
{
|
|
||||||
yChange += 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
else if (x > 1 && yChange < 8 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + yChange) < 150 && nBmp.GetAlpha(x + 1, y + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 1 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 2 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 2 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 3 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x, y - 2 + yChange) < 150 && nBmp.GetAlpha(x, y - 3 + yChange) < 150)
|
|
||||||
{
|
|
||||||
yChange -= 2;
|
|
||||||
}
|
|
||||||
else if (x > 1 && yChange < 8 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + yChange) < 150 && nBmp.GetAlpha(x + 1, y + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 1 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 2 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 2 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 3 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 3 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 4 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x, y - 3 + yChange) < 150 && nBmp.GetAlpha(x, y - 4 + yChange) < 150)
|
|
||||||
{
|
|
||||||
yChange -= 3;
|
|
||||||
}
|
|
||||||
else if (x > 1 && yChange < 7 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y + yChange) < 150 && nBmp.GetAlpha(x + 1, y + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 1 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 2 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 2 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 3 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 3 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 4 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x + 1, y - 4 + yChange) < 150 && nBmp.GetAlpha(x + 1, y - 5 + yChange) < 150 &&
|
|
||||||
nBmp.GetAlpha(x, y - 4 + yChange) < 150 && nBmp.GetAlpha(x, y - 5 + yChange) < 150)
|
|
||||||
{
|
|
||||||
yChange -= 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
started = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (started)
|
|
||||||
{
|
|
||||||
points.Add(new Point(x, y + yChange));
|
|
||||||
}
|
|
||||||
|
|
||||||
completed = x <= 1;
|
|
||||||
x--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (completed)
|
|
||||||
{
|
|
||||||
foreach (var point in points)
|
|
||||||
{
|
|
||||||
nBmp.SetPixel(point.X, point.Y, c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
pictureBoxSubtitleImage.Image = nBmp.GetBitmap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MakeHorizontalSplit()
|
private void MakeHorizontalSplit()
|
||||||
@ -6711,7 +6599,7 @@ namespace Nikse.SubtitleEdit.Forms.Ocr
|
|||||||
var nBmp = new NikseBitmap(bmp);
|
var nBmp = new NikseBitmap(bmp);
|
||||||
bmp.Dispose();
|
bmp.Dispose();
|
||||||
bool started = false;
|
bool started = false;
|
||||||
Dictionary<int, List<Point>> splitLines = new Dictionary<int, List<Point>>();
|
var splitLines = new Dictionary<int, List<Point>>();
|
||||||
for (int y = 12; y < nBmp.Height - 15; y++)
|
for (int y = 12; y < nBmp.Height - 15; y++)
|
||||||
{
|
{
|
||||||
var points = new List<Point>();
|
var points = new List<Point>();
|
||||||
@ -6854,7 +6742,7 @@ namespace Nikse.SubtitleEdit.Forms.Ocr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
textBoxCurrentText.Text = $"{straightLines} straight horizontal lines";
|
Text = $"{straightLines} straight horizontal lines";
|
||||||
|
|
||||||
pictureBoxSubtitleImage.Image = nBmp.GetBitmap();
|
pictureBoxSubtitleImage.Image = nBmp.GetBitmap();
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Nikse.SubtitleEdit.Logic
|
namespace Nikse.SubtitleEdit.Logic
|
||||||
{
|
{
|
||||||
@ -428,7 +429,17 @@ namespace Nikse.SubtitleEdit.Logic
|
|||||||
var list = new List<ImageSplitterItem>();
|
var list = new List<ImageSplitterItem>();
|
||||||
|
|
||||||
// split into separate lines
|
// split into separate lines
|
||||||
var lineBitmaps = SplitToLines(bmp, minLineHeight, averageLineHeight);
|
var lineBitmaps = new List<ImageSplitterItem>();
|
||||||
|
|
||||||
|
//OLD: lineBitmaps = SplitToLines(bmp, minLineHeight, averageLineHeight);
|
||||||
|
|
||||||
|
// fast 3-x-blank-horizontal-lines split
|
||||||
|
var tempBitmaps = SplitToLinesByMinTransparentHorizontalLines(bmp, minLineHeight, 3);
|
||||||
|
foreach (var bitmap in tempBitmaps)
|
||||||
|
{
|
||||||
|
var bitmaps = SplitToLinesNew(bitmap, minLineHeight, averageLineHeight); // more advanced split (allows for up/down)
|
||||||
|
lineBitmaps.AddRange(bitmaps);
|
||||||
|
}
|
||||||
|
|
||||||
if (!topToBottom)
|
if (!topToBottom)
|
||||||
{
|
{
|
||||||
@ -461,6 +472,305 @@ namespace Nikse.SubtitleEdit.Logic
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// split into lines
|
||||||
|
/// </summary>
|
||||||
|
public static List<ImageSplitterItem> SplitToLinesByMinTransparentHorizontalLines(NikseBitmap bmp, int minLineHeight, int minTransparentLines)
|
||||||
|
{
|
||||||
|
var parts = new List<ImageSplitterItem>();
|
||||||
|
var startY = 0;
|
||||||
|
var lastTransparentY = -1;
|
||||||
|
var keysInSequence = 0;
|
||||||
|
for (int y = minLineHeight; y < bmp.Height - minLineHeight; y++)
|
||||||
|
{
|
||||||
|
var isLineTransparent = bmp.IsLineTransparent(y);
|
||||||
|
if (startY == y && isLineTransparent)
|
||||||
|
{
|
||||||
|
startY++;
|
||||||
|
continue; // skip start
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLineTransparent)
|
||||||
|
{
|
||||||
|
if (lastTransparentY == y - 1)
|
||||||
|
{
|
||||||
|
if (keysInSequence == 0)
|
||||||
|
{
|
||||||
|
keysInSequence++;
|
||||||
|
}
|
||||||
|
|
||||||
|
keysInSequence++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keysInSequence > 2 && lastTransparentY - startY > minLineHeight)
|
||||||
|
{
|
||||||
|
var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, lastTransparentY - startY - 1));
|
||||||
|
if (!part.IsImageOnlyTransparent())
|
||||||
|
{
|
||||||
|
var croppedTop = part.CropTopTransparent(0);
|
||||||
|
parts.Add(new ImageSplitterItem(0, startY + croppedTop, part));
|
||||||
|
}
|
||||||
|
startY = lastTransparentY + 1;
|
||||||
|
}
|
||||||
|
lastTransparentY = y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
keysInSequence = 0;
|
||||||
|
lastTransparentY = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bmp.Height - startY > minLineHeight)
|
||||||
|
{
|
||||||
|
var part = bmp.CopyRectangle(new Rectangle(0, startY, bmp.Width, bmp.Height - startY));
|
||||||
|
if (!part.IsImageOnlyTransparent())
|
||||||
|
{
|
||||||
|
var croppedTop = part.CropTopTransparent(0);
|
||||||
|
parts.Add(new ImageSplitterItem(0, startY + croppedTop, part));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// split into lines
|
||||||
|
/// </summary>
|
||||||
|
public static List<ImageSplitterItem> SplitToLinesNew(ImageSplitterItem item, int minLineHeight, double averageLineHeight = -1)
|
||||||
|
{
|
||||||
|
var bmp = 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;
|
||||||
|
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 < 15; i++)
|
||||||
|
{
|
||||||
|
for (int k = 1; k < 9; k++)
|
||||||
|
{
|
||||||
|
if (CanGoUpAndRight(bmp, i, 12, x - k, y + yChange))
|
||||||
|
{
|
||||||
|
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 lastKey = -10;
|
||||||
|
var transparentColor = Color.FromArgb(0, 0, 0, 0);
|
||||||
|
foreach (var line in splitLines)
|
||||||
|
{
|
||||||
|
var key = line.Key;
|
||||||
|
if (key - startY > minLineHeight)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!part.IsImageOnlyTransparent())
|
||||||
|
{
|
||||||
|
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, startY + croppedTop, part));
|
||||||
|
}
|
||||||
|
|
||||||
|
startY = key + 1;
|
||||||
|
}
|
||||||
|
lastKey = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bmp.Height - startY > minLineHeight && 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, startY + croppedTop, part));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parts.Count == 0)
|
||||||
|
{
|
||||||
|
return new List<ImageSplitterItem> { item };
|
||||||
|
}
|
||||||
|
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool CanGoUpAndRight(NikseBitmap bmp, int up, int right, int x, int y)
|
||||||
|
{
|
||||||
|
if (y - up < 0 || x + right >= bmp.Width)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int myY = y; myY > y - up && myY > 1; myY--)
|
||||||
|
{
|
||||||
|
var a = bmp.GetAlpha(x, myY);
|
||||||
|
if (a > 150)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int myX = x; x < x + right && myX < bmp.Width; myX++)
|
||||||
|
{
|
||||||
|
var a = bmp.GetAlpha(myX, y - up);
|
||||||
|
if (a > 150)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private static IEnumerable<ImageSplitterItem> SplitHorizontalNew(ImageSplitterItem lineSplitterItem, int xOrMorePixelsMakesSpace)
|
private static IEnumerable<ImageSplitterItem> SplitHorizontalNew(ImageSplitterItem lineSplitterItem, int xOrMorePixelsMakesSpace)
|
||||||
{
|
{
|
||||||
var bmp = new NikseBitmap(lineSplitterItem.NikseBitmap);
|
var bmp = new NikseBitmap(lineSplitterItem.NikseBitmap);
|
||||||
|
Loading…
Reference in New Issue
Block a user