我有一个包含一些黑色字母的图像。 我试图逐个导出这些字母。我的代码工作正常,直到图像包含多行。
图片如下所示:
请注意,此图片基本上是"正常"字母。在某些时候,它们会以陌生的方式倾斜并弯曲。
文件夹SplitedImages
中显示的图片:
我的导出代码:
foreach (string s in Directory.GetFiles(Application.StartupPath + "\\CaptchaImages"))
{
RawCaptcha = new ImageData(MakeGrayscale3(new Bitmap(s), 160));
MakeGrayscale3(new Bitmap(s), 160).Save(Application.StartupPath + "StackOverFlow.png");
// remove the blue pixels
Filter.ReplaceSimilarColor(ref RawCaptcha, Color.FromArgb(98, 139, 218), Color.FromArgb(226, 226, 226), 70);
// darken the dark black pixels
Filter.ReplaceSimilarColor(ref RawCaptcha, Color.FromArgb(25, 32, 16), Color.Black, 50);
// convert to black and white
Filter.BlackAndWhite(ref RawCaptcha, 20);
/* --------------- Buchstaben trennen -------------------------------------------- */
// wir testen jede Spalte
bool[] VertikaleLinien = new bool[RawCaptcha.Width];
// jede Spalte durchlaufen
for (Int32 column = 0; column < RawCaptcha.Width; column++)
{
// erst denken wir, dass wir eine Linie zeichnen können
bool blank = true;
// dann schauen wir mal, ob wir an schwarzen Pixeln anecken
for (Int32 row = 0; row < RawCaptcha.Height; row++)
{
if (RawCaptcha.GetPixel(column, row) == Color.Black)
{
// ups ein schwarzer Pixel => hier ist ein Buchstabe
blank = false;
break;
}
}
// alle Pixel weiß
if (blank)
{
// wir merken uns, dass wir die Linie zeichnen können
VertikaleLinien[column] = true;
// und Linie zeichnen
for (int row = 0; row < RawCaptcha.Height; row++)
RawCaptcha.SetPixel(column, row, Color.FromArgb(225, 225, 225));
}
else
{
// Linie kann nicht gezeichnet werden
VertikaleLinien[column] = false;
}
}
List<Bitmap> Letters = new List<Bitmap>();
bool open = false; // = false --> nor red area
int left = 0, width = 0; // remember position
for (Int32 column = 0; column < RawCaptcha.Width; column++)
{
// not in gray area?
if (!VertikaleLinien[column])
{
if (open == false)
{
// new start of letter
left = column;
// draw green vertical line
for (int row = 0; row < RawCaptcha.Height; row++)
RawCaptcha.SetPixel(column - 1, row, Color.Green);
}
open = true;
}
else
{
if (open == true)
{
// end of current letter
width = column - left - 1;
if (width > 1)
{
Letters.Add(RawCaptcha.GetBitmap(left, 0, width, RawCaptcha.Height - 3));
// draw blue vertical line
for (int row = 0; row < RawCaptcha.Height; row++)
RawCaptcha.SetPixel(column + 1, row, Color.Blue);
left = column;
open = false;
}
}
}
}
foreach (Bitmap bmpp in Letters)
{
bmpp.Save(Application.StartupPath + "\\SplitedImages\\" + GetFileName(Application.StartupPath + "\\SplitedImages") + ".png", ImageFormat.Png);
}
filesToDelete.Add(s);
Application.DoEvents();
}