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