diff --git a/.gitignore b/.gitignore index a5c24d58..d0899be8 100644 --- a/.gitignore +++ b/.gitignore @@ -186,3 +186,4 @@ pip-log.txt /src/AssemblyVersionInfo.cs /*.Log +*.sdsettings diff --git a/Samples/Tesseract.ConsoleDemo/Program.cs b/Samples/Tesseract.ConsoleDemo/Program.cs index 66a0dfcc..90812226 100644 --- a/Samples/Tesseract.ConsoleDemo/Program.cs +++ b/Samples/Tesseract.ConsoleDemo/Program.cs @@ -71,7 +71,7 @@ public static void Main(string[] args) private class ResultPrinter { - private FormattedConsoleLogger logger; + readonly FormattedConsoleLogger logger; public ResultPrinter(FormattedConsoleLogger logger) { diff --git a/Samples/Tesseract.WebDemo/Default.aspx.cs b/Samples/Tesseract.WebDemo/Default.aspx.cs index 295f3845..0531d746 100644 --- a/Samples/Tesseract.WebDemo/Default.aspx.cs +++ b/Samples/Tesseract.WebDemo/Default.aspx.cs @@ -49,7 +49,7 @@ private void OnSubmitFileClicked(object sender, EventArgs args) { // for now just fail hard if there's any error however in a propper app I would expect a full demo. - using (var engine = new TesseractEngine(Server.MapPath(@"./tessdata"), "eng", EngineMode.Default)) + using (var engine = new TesseractEngine(Server.MapPath(@"~/tessdata"), "eng", EngineMode.Default)) { // have to load Pix via a bitmap since Pix doesn't support loading a stream. using (var image = new System.Drawing.Bitmap(imageFile.PostedFile.InputStream)) diff --git a/build.proj b/build.proj index 616931f4..24d385e4 100644 --- a/build.proj +++ b/build.proj @@ -1,7 +1,7 @@ - 1.0.10 + 1.0.11 $(MSBuildProjectDirectory)\src $(MSBuildProjectDirectory)\bin $(MSBuildProjectDirectory)\release diff --git a/src/Tesseract.Tests/EngineTests.cs b/src/Tesseract.Tests/EngineTests.cs index 80d38f1f..a36a2338 100644 --- a/src/Tesseract.Tests/EngineTests.cs +++ b/src/Tesseract.Tests/EngineTests.cs @@ -52,6 +52,31 @@ public void CanParseText() } } } + + [Test] + public void CanParseDifferentRegionsInSameImage() + { + using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default)) { + using(var img = Pix.LoadFromFile("./phototest.tif")) { + using(var page = engine.Process(img, Rect.FromCoords(0, 0, img.Width, 188))) { + var region1Text = page.GetText(); + + const string expectedTextRegion1 = + "This is a lot of 12 point text to test the\nocr code and see if it works on all types\nof file format.\n\n"; + + Assert.That(region1Text, Is.EqualTo(expectedTextRegion1)); + + page.RegionOfInterest = Rect.FromCoords(0, 188, img.Width, img.Height); + + var region2Text = page.GetText(); + const string expectedTextRegion2 = + "The quick brown dog jumped over the\nlazy fox. The quick brown dog jumped\nover the lazy fox. The quick brown dog\njumped over the lazy fox. The quick\nbrown dog jumped over the lazy fox.\n\n"; + + Assert.That(region2Text, Is.EqualTo(expectedTextRegion2)); + } + } + } + } [Test] public void CanParseUznFile() diff --git a/src/Tesseract/ChangeLog.md b/src/Tesseract/ChangeLog.md index d86deca6..868c8e68 100644 --- a/src/Tesseract/ChangeLog.md +++ b/src/Tesseract/ChangeLog.md @@ -1,3 +1,8 @@ ### Version 1.10 -* Added support for uzn files - [Issue 66](https://github.com/charlesw/tesseract/issues/66) \ No newline at end of file +* Added support for uzn files - [Issue 66](https://github.com/charlesw/tesseract/issues/66) + +### Version 1.11 + +* Allow changing the current region of interest without having to reload the entire image (Page.RegionOfInterest) +* Fixed loader for ASP.NET [Issue 97](https://github.com/charlesw/tesseract/issues/97) \ No newline at end of file diff --git a/src/Tesseract/Interop/WindowsLibraryLoader.cs b/src/Tesseract/Interop/WindowsLibraryLoader.cs index 198b9b96..d66e763a 100644 --- a/src/Tesseract/Interop/WindowsLibraryLoader.cs +++ b/src/Tesseract/Interop/WindowsLibraryLoader.cs @@ -126,7 +126,7 @@ public void LoadLibrary(string dllName) #if !ClientProfile if(HttpContext.Current != null) { var server = HttpContext.Current.Server; - baseDirectory = Path.GetFullPath(server.MapPath("bin")); + baseDirectory = Path.GetFullPath(server.MapPath("~/bin")); dllHandle = LoadLibraryInternal(dllName, baseDirectory, processArch); if (dllHandle != IntPtr.Zero) return; } diff --git a/src/Tesseract/Page.cs b/src/Tesseract/Page.cs index d0cbb302..332eb34e 100644 --- a/src/Tesseract/Page.cs +++ b/src/Tesseract/Page.cs @@ -9,14 +9,41 @@ namespace Tesseract public sealed class Page : DisposableBase { private bool runRecognitionPhase; - + private Rect regionOfInterest; + + public TesseractEngine Engine { get; private set; } + public Pix Image { get; private set; } - internal Page(TesseractEngine engine) + internal Page(TesseractEngine engine, Pix image, Rect regionOfInterest) { Engine = engine; + Image = image; + RegionOfInterest = regionOfInterest; } - + + /// + /// The current region of interest being parsed. + /// + public Rect RegionOfInterest { + get { + return regionOfInterest; + } + set { + if (value.X1 < 0 || value.Y1 < 0 || value.X2 > Image.Width || value.Y2 > Image.Height) + throw new ArgumentException("The region of interest to be processed must be within the image bounds.", "value"); + + if(regionOfInterest != value) { + regionOfInterest = value; + + // update region of interest in image + Interop.TessApi.BaseApiSetRectangle(Engine.Handle, regionOfInterest.X1, regionOfInterest.Y1, regionOfInterest.Width, regionOfInterest.Height); + + // request rerun of recognition on the next call that requires recognition + runRecognitionPhase = true; + } + } + } public PageIterator AnalyseLayout() { diff --git a/src/Tesseract/TesseractEngine.cs b/src/Tesseract/TesseractEngine.cs index ab72a9c9..766adcd5 100644 --- a/src/Tesseract/TesseractEngine.cs +++ b/src/Tesseract/TesseractEngine.cs @@ -227,11 +227,10 @@ public Page Process(Pix image, string inputName, Rect region, PageSegMode? pageS Interop.TessApi.BaseAPISetPageSegMode(handle, pageSegMode.HasValue ? pageSegMode.Value : DefaultPageSegMode); Interop.TessApi.BaseApiSetImage(handle, image.Handle); - Interop.TessApi.BaseApiSetRectangle(handle, region.X1, region.Y1, region.Width, region.Height); if(!String.IsNullOrEmpty(inputName)) { Interop.TessApi.BaseApiSetInputName(handle, inputName); } - var page = new Page(this); + var page = new Page(this, image, region); page.Disposed += OnIteratorDisposed; return page; }