From 3cdac580703710f4a5d1a49d185562915f4690da Mon Sep 17 00:00:00 2001 From: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com> Date: Sun, 18 Dec 2022 16:35:03 +0100 Subject: [PATCH] [TextExtractor]Select OCR language in context menu (#22777) * TextExtractor Add language selection. * TextExtractor adding resources --- .../PowerOCR/PowerOCR/Helpers/ImageMethods.cs | 17 ++++--- src/modules/PowerOCR/PowerOCR/OCROverlay.xaml | 7 +-- .../PowerOCR/PowerOCR/OCROverlay.xaml.cs | 47 +++++++++++++++++-- .../Settings.UI/Strings/en-us/Resources.resw | 3 ++ 4 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/modules/PowerOCR/PowerOCR/Helpers/ImageMethods.cs b/src/modules/PowerOCR/PowerOCR/Helpers/ImageMethods.cs index abaee96012..d5fa1a49ab 100644 --- a/src/modules/PowerOCR/PowerOCR/Helpers/ImageMethods.cs +++ b/src/modules/PowerOCR/PowerOCR/Helpers/ImageMethods.cs @@ -53,7 +53,7 @@ internal class ImageMethods return BitmapToImageSource(bmp); } - internal static async Task GetRegionsText(Window? passedWindow, Rectangle selectedRegion) + internal static async Task GetRegionsText(Window? passedWindow, Rectangle selectedRegion, Language? preferredLanguage) { using Bitmap bmp = new Bitmap(selectedRegion.Width, selectedRegion.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); using Graphics g = Graphics.FromImage(bmp); @@ -66,12 +66,12 @@ internal class ImageMethods g.CopyFromScreen(thisCorrectedLeft, thisCorrectedTop, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); // bmp = PadImage(bmp); - string? resultText = await ExtractText(bmp); + string? resultText = await ExtractText(bmp, preferredLanguage); return resultText != null ? resultText.Trim() : string.Empty; } - internal static async Task GetClickedWord(Window passedWindow, System.Windows.Point clickedPoint) + internal static async Task GetClickedWord(Window passedWindow, System.Windows.Point clickedPoint, Language? preferredLanguage) { DpiScale dpi = VisualTreeHelper.GetDpi(passedWindow); Bitmap bmp = new Bitmap((int)(passedWindow.ActualWidth * dpi.DpiScaleX), (int)(passedWindow.ActualHeight * dpi.DpiScaleY), System.Drawing.Imaging.PixelFormat.Format32bppArgb); @@ -85,13 +85,18 @@ internal class ImageMethods System.Windows.Point adjustedPoint = new System.Windows.Point(clickedPoint.X, clickedPoint.Y); - string resultText = await ExtractText(bmp, adjustedPoint); + string resultText = await ExtractText(bmp, preferredLanguage, adjustedPoint); return resultText.Trim(); } - public static async Task ExtractText(Bitmap bmp, System.Windows.Point? singlePoint = null) + public static async Task ExtractText(Bitmap bmp, Language? preferredLanguage, System.Windows.Point? singlePoint = null) { - Language? selectedLanguage = GetOCRLanguage(); + Language? selectedLanguage = preferredLanguage; + if (selectedLanguage == null) + { + selectedLanguage = GetOCRLanguage(); + } + if (selectedLanguage == null) { return string.Empty; diff --git a/src/modules/PowerOCR/PowerOCR/OCROverlay.xaml b/src/modules/PowerOCR/PowerOCR/OCROverlay.xaml index 923c1cb06a..e026782a25 100644 --- a/src/modules/PowerOCR/PowerOCR/OCROverlay.xaml +++ b/src/modules/PowerOCR/PowerOCR/OCROverlay.xaml @@ -45,12 +45,7 @@ Color="Black" /> - - - + diff --git a/src/modules/PowerOCR/PowerOCR/OCROverlay.xaml.cs b/src/modules/PowerOCR/PowerOCR/OCROverlay.xaml.cs index 7dfc4dce38..74ec78ec6f 100644 --- a/src/modules/PowerOCR/PowerOCR/OCROverlay.xaml.cs +++ b/src/modules/PowerOCR/PowerOCR/OCROverlay.xaml.cs @@ -3,6 +3,8 @@ // See the LICENSE file in the project root for more information. using System; +using System.Collections.Generic; +using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -10,6 +12,8 @@ using System.Windows.Media; using Microsoft.PowerToys.Telemetry; using PowerOCR.Helpers; using PowerOCR.Utilities; +using Windows.Globalization; +using Windows.Media.Ocr; namespace PowerOCR; @@ -30,6 +34,9 @@ public partial class OCROverlay : Window private Point GetMousePos() => PointToScreen(Mouse.GetPosition(this)); + private Language? selectedLanguage = null; + private MenuItem cancelMenuItem; + private System.Windows.Forms.Screen? CurrentScreen { get; @@ -47,6 +54,40 @@ public partial class OCROverlay : Window public OCROverlay() { InitializeComponent(); + + // build context menu + selectedLanguage = ImageMethods.GetOCRLanguage(); + string? selectedLanguageName = selectedLanguage?.DisplayName; + List possibleOcrLanguages = OcrEngine.AvailableRecognizerLanguages.ToList(); + foreach (Language language in possibleOcrLanguages) + { + MenuItem menuItem = new MenuItem() { Header = language.DisplayName, Tag = language, IsCheckable = true }; + menuItem.IsChecked = language.DisplayName.Equals(selectedLanguageName); + menuItem.Click += LanguageMenuItem_Click; + CanvasContextMenu.Items.Add(menuItem); + } + + CanvasContextMenu.Items.Add(new Separator()); + + // ResourceLoader resourceLoader = ResourceLoader.GetForViewIndependentUse(); // resourceLoader.GetString("TextExtractor_Cancel") + cancelMenuItem = new MenuItem() { Header = "cancel" }; + cancelMenuItem.Click += CancelMenuItem_Click; + CanvasContextMenu.Items.Add(cancelMenuItem); + } + + private void LanguageMenuItem_Click(object sender, RoutedEventArgs e) + { + MenuItem menuItem = (MenuItem)sender; + foreach (var item in CanvasContextMenu.Items) + { + if (item is MenuItem) + { + MenuItem menuItemLoop = (MenuItem)item; + menuItemLoop.IsChecked = item.Equals(menuItem); + } + } + + selectedLanguage = menuItem.Tag as Language; } private void Window_Loaded(object sender, RoutedEventArgs e) @@ -78,7 +119,7 @@ public partial class OCROverlay : Window RegionClickCanvas.MouseUp -= RegionClickCanvas_MouseUp; RegionClickCanvas.MouseMove -= RegionClickCanvas_MouseMove; - CancelMenuItem.Click -= CancelMenuItem_Click; + cancelMenuItem.Click -= CancelMenuItem_Click; } private void MainWindow_KeyUp(object sender, KeyEventArgs e) @@ -259,11 +300,11 @@ public partial class OCROverlay : Window if (regionScaled.Width < 3 || regionScaled.Height < 3) { - grabbedText = await ImageMethods.GetClickedWord(this, new Point(xDimScaled, yDimScaled)); + grabbedText = await ImageMethods.GetClickedWord(this, new Point(xDimScaled, yDimScaled), selectedLanguage); } else { - grabbedText = await ImageMethods.GetRegionsText(this, regionScaled); + grabbedText = await ImageMethods.GetRegionsText(this, regionScaled, selectedLanguage); } if (string.IsNullOrWhiteSpace(grabbedText) == false) diff --git a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw index b4821a373b..fb56297470 100644 --- a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw +++ b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw @@ -2559,6 +2559,9 @@ Activate by holding the key for the character you want to add an accent to, then Learn more about Text Extractor + + cancel + A new backup was not created because no settings have been changed since last backup.