导出图像部分

时间:2014-11-14 15:07:49

标签: c# image-processing

我有一个包含一些黑色字母的图像。 我试图逐个导出这些字母。我的代码工作正常,直到图像包含多行。

图片如下所示:

enter image description here

请注意,此图片基本上是"正常"字母。在某些时候,它们会以陌生的方式倾斜并弯曲。

文件夹SplitedImages中显示的图片:

enter image description here

我的导出代码:

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();
}

0 个答案:

没有答案