Пример #1
0
        private static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Optical Mark Engine Console Utility");
                Console.WriteLine("Version {0}, {1}", Assembly.GetEntryAssembly().GetName().Version,
                                  Assembly.GetEntryAssembly()
                                  .GetCustomAttributes(typeof(AssemblyCopyrightAttribute))
                                  .Select(o => o as AssemblyCopyrightAttribute)
                                  .First()
                                  .Copyright);

                // Parse parameters
                var parser     = new ParameterParser <ConsoleParameters>();
                var parameters = parser.Parse(args);

                // Show help?
                var showHelp = string.IsNullOrEmpty(parameters.OutputFile) || string.IsNullOrEmpty(parameters.Template) ||
                               (parameters.SourceFiles == null) ||
                               parameters.Help;
                if (showHelp)
                {
                    parser.WriteHelp(Console.Out);
                }
                else if (!File.Exists(parameters.Template))
                {
                    throw new ArgumentException(string.Format("{0} not found", parameters.Template));
                }
                else if ((parameters.OutputFormat.ToLower() != "csv") && (parameters.OutputFormat.ToLower() != "xml"))
                {
                    throw new ArgumentException("Output format must be XML or CSV!");
                }

                // Load the files
                foreach (var ptrn in parameters.SourceFiles)
                {
                    string directory = Path.GetDirectoryName(ptrn) ?? ".",
                             pattern = Path.GetFileName(ptrn);

                    // Get files
                    var outputCollection = new OmrPageOutputCollection();
                    var engine           = new Engine();
                    var tsu      = new TemplateScriptUtil();
                    var template = OmrTemplate.Load(parameters.Template);


                    // Process files
                    foreach (var fileName in Directory.GetFiles(directory, pattern))
                    {
                        Console.Write("Processing {0}...", Path.GetFileName(fileName));
                        using (var sci = new ScannedImage(fileName))
                        {
                            sci.Analyze();
                            if (sci.TemplateName != template.Id)
                            {
                                Console.WriteLine("Wrong template!");
                                continue;
                            }

                            var output   = engine.ApplyTemplate(template, sci);
                            var validate = output.Validate(template);
                            if (parameters.Validate && !validate.IsValid)
                            {
                                Console.WriteLine("Invalid");
                                foreach (var iss in validate.Issues)
                                {
                                    Console.WriteLine("\t{0}", iss);
                                }
                            }
                            else
                            {
                                try
                                {
                                    if (parameters.Run)
                                    {
                                        tsu.Run(template, output);
                                    }
                                    outputCollection.Pages.Add(output);
                                    Console.WriteLine("Success");
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine("Error\r\n\t{0}", e.Message);
                                }
                            }
                        }
                    }

                    // Save the output?
                    switch (parameters.OutputFormat)
                    {
                    case "csv":
                    {
                        var outputBytes = new CsvOutputTransform().Transform(template, outputCollection);
                        using (var fs = File.Create(parameters.OutputFile))
                        {
                            fs.Write(outputBytes, 0, outputBytes.Length);
                        }
                        break;
                    }

                    default:
                    {
                        var outputBytes = new RawOutputTransform().Transform(template, outputCollection);
                        using (var fs = File.Create(parameters.OutputFile))
                        {
                            fs.Write(outputBytes, 0, outputBytes.Length);
                        }
                    }
                    break;
                    }
                }
#if DEBUG
                Console.ReadKey();
#endif
                Environment.Exit(0);
            }
            catch (Exception e)
            {
                Trace.TraceError(e.ToString());
                Console.WriteLine("Error: {0}", e.Message);
                Environment.Exit(-1);
            }
        }
Пример #2
0
        /// <summary>
        /// Do work
        /// </summary>
        private void ProcessImageWorker(object state)
        {
            ScannedImage scannedImage = null;
            Image        original     = null;

            try
            {
                lock (this.m_lockObject)
                    using (var ms = new MemoryStream((byte[])state))
                    {
                        var img = Image.FromStream(ms);
                        img.RotateFlip(RotateFlipType.Rotate270FlipNone);
                        scannedImage = new ScannedImage(img);
                    }

                scannedImage.Analyze();

                original = (Image) new AForge.Imaging.Filters.ResizeNearestNeighbor(scannedImage.Image.Width / 4, scannedImage.Image.Height / 4).Apply((Bitmap)scannedImage.Image);
            }
            catch
            {
                if (scannedImage != null)
                {
                    scannedImage.Dispose();
                }
                return; // Abort
            }

            try
            {
                // Add an Error entry
                if (!scannedImage.IsScannable)
                {
                    ListViewItem lsv = new ListViewItem();
                    lsv.Tag = 2;
                    lsv.SubItems.Add(new ListViewItem.ListViewSubItem(lsv, "Scanned image doesn't appear to be a scannable form."));
                    lock (this.m_lockObject)
                        this.m_uiResults.Add(lsv, original);
                }
                else
                {
                    Engine engine       = new Engine();
                    var    templateFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), scannedImage.TemplateName + ".mxml");
                    if (!File.Exists(templateFile))
                    {
                        ListViewItem lsv = new ListViewItem();
                        lsv.Tag = 0;
                        lsv.SubItems.Add(new ListViewItem.ListViewSubItem(lsv, "Template file " + templateFile + " is missing"));
                        lock (this.m_lockObject)
                            this.m_uiResults.Add(lsv, original);
                        return;
                    }

                    // Apply template
                    var template = OmrTemplate.Load(templateFile);
                    var pageData = engine.ApplyTemplate(
                        template,
                        scannedImage);

                    // Draw the page data
                    ICanvas canvas = new DesignerCanvas();
                    canvas.Add(new OmrMarkEngine.Output.Design.OutputVisualizationStencil(pageData));
                    original.Dispose();
                    original = new Bitmap((int)template.BottomRight.X, (int)template.BottomLeft.Y, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    using (Graphics g = Graphics.FromImage(original))
                    {
                        float width  = template.TopRight.X - template.TopLeft.X,
                              height = template.BottomLeft.Y - template.TopLeft.Y;
                        g.DrawImage(scannedImage.Image, template.TopLeft.X, template.TopLeft.Y, width, height);
                        canvas.DrawTo(g);
                    }
                    // Save original analyzed image
                    try
                    {
                        String tPath = Path.GetTempFileName();
                        original.Save(tPath);
                        pageData.AnalyzedImage = tPath;
                    }
                    catch { }

                    var oldOriginal = original;
                    original = (Image) new AForge.Imaging.Filters.ResizeNearestNeighbor(scannedImage.Image.Width / 2, scannedImage.Image.Height / 2).Apply((Bitmap)original);
                    oldOriginal.Dispose();



                    lock (this.m_lockObject)
                    {
                        if (pageData.Outcome == OmrScanOutcome.Failure)
                        {
                            ListViewItem lsv = new ListViewItem();
                            lsv.Tag = 0;
                            lsv.SubItems.Add(new ListViewItem.ListViewSubItem(lsv, pageData.ErrorMessage));
                            lock (this.m_lockObject)
                                this.m_uiResults.Add(lsv, original);
                        }
                        else
                        {
                            var          validation = pageData.Validate(template);
                            ListViewItem lsv        = new ListViewItem();
                            lsv.Tag = validation.IsValid ? 2 : 1;
                            if (!validation.IsValid)
                            {
                                lsv.SubItems.Add(validation.Issues[0]);
                            }
                            lsv.Tag = pageData;
                            lock (this.m_lockObject)
                                this.m_executionQueue.Enqueue(new KeyValuePair <OmrTemplate, OmrPageOutput>(template, pageData));
                            lock (this.m_lockObject)
                                this.m_uiResults.Add(lsv, original);
                        }
                        this.m_scannedPages.Pages.Add(pageData);
                    }
                }
            }
            catch (Exception e)
            {
                ListViewItem lsv = new ListViewItem();
                lsv.Tag = 0;
                lsv.SubItems.Add(e.Message);
                lock (this.m_lockObject)
                    this.m_uiResults.Add(lsv, original);
            }
        }
Пример #3
0
        /// <summary>
        /// Open
        /// </summary>
        private void mnuOpen_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.m_currentTemplate != null)
                {
                    switch (MessageBox.Show("Do you want to save your changes before opening another template?", "Confirm Open", MessageBoxButtons.YesNoCancel))
                    {
                    case System.Windows.Forms.DialogResult.Cancel:
                        return;

                    case System.Windows.Forms.DialogResult.Yes:
                        this.mnuSave_Click(sender, e);
                        break;
                    }
                }

                var openDialog = new OpenFileDialog()
                {
                    Title        = "Open Template",
                    Filter       = "Marker Engine XML (*.mxml)|*.mxml",
                    AddExtension = true
                };
                if (openDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    this.m_currentTemplate = OmrTemplate.Load(openDialog.FileName);
                    lsvImages.Items.Clear();
                    this.mnuSave.Enabled = true;
                    this.UpdateTemplateDiagram();
                    // Add field data
                    foreach (var itm in this.m_currentTemplate.Fields)
                    {
                        PointF pos  = itm.TopLeft;
                        SizeF  size = new SizeF(itm.TopRight.X - itm.TopLeft.X, itm.BottomLeft.Y - itm.TopLeft.Y);
                        if (itm is OmrBarcodeField)
                        {
                            this.m_canvas.Add(new BarcodeFormFieldStencil(itm as OmrBarcodeField)
                            {
                                Position = pos, Size = size
                            }, itm.Id);
                        }
                        else if (itm is OmrBubbleField)
                        {
                            this.m_canvas.Add(new BubbleFormFieldStencil(itm as OmrBubbleField)
                            {
                                Position = pos, Size = size
                            }, itm.Id);
                        }
                        this.testToolStripMenuItem.Enabled = true;
                    }
                }
                else
                {
                    return;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Could not open template: " + ex.Message);
            }
        }