[TextExtractor]Select OCR language in context menu (#22777)

* TextExtractor Add language selection.

* TextExtractor adding resources
This commit is contained in:
Laszlo Nemeth
2022-12-18 16:35:03 +01:00
committed by GitHub
parent 6d138e80fb
commit 3cdac58070
4 changed files with 59 additions and 15 deletions

View File

@@ -53,7 +53,7 @@ internal class ImageMethods
return BitmapToImageSource(bmp); return BitmapToImageSource(bmp);
} }
internal static async Task<string> GetRegionsText(Window? passedWindow, Rectangle selectedRegion) internal static async Task<string> GetRegionsText(Window? passedWindow, Rectangle selectedRegion, Language? preferredLanguage)
{ {
using Bitmap bmp = new Bitmap(selectedRegion.Width, selectedRegion.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); using Bitmap bmp = new Bitmap(selectedRegion.Width, selectedRegion.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
using Graphics g = Graphics.FromImage(bmp); using Graphics g = Graphics.FromImage(bmp);
@@ -66,12 +66,12 @@ internal class ImageMethods
g.CopyFromScreen(thisCorrectedLeft, thisCorrectedTop, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); g.CopyFromScreen(thisCorrectedLeft, thisCorrectedTop, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
// bmp = PadImage(bmp); // bmp = PadImage(bmp);
string? resultText = await ExtractText(bmp); string? resultText = await ExtractText(bmp, preferredLanguage);
return resultText != null ? resultText.Trim() : string.Empty; return resultText != null ? resultText.Trim() : string.Empty;
} }
internal static async Task<string> GetClickedWord(Window passedWindow, System.Windows.Point clickedPoint) internal static async Task<string> GetClickedWord(Window passedWindow, System.Windows.Point clickedPoint, Language? preferredLanguage)
{ {
DpiScale dpi = VisualTreeHelper.GetDpi(passedWindow); DpiScale dpi = VisualTreeHelper.GetDpi(passedWindow);
Bitmap bmp = new Bitmap((int)(passedWindow.ActualWidth * dpi.DpiScaleX), (int)(passedWindow.ActualHeight * dpi.DpiScaleY), System.Drawing.Imaging.PixelFormat.Format32bppArgb); 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); 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(); return resultText.Trim();
} }
public static async Task<string> ExtractText(Bitmap bmp, System.Windows.Point? singlePoint = null) public static async Task<string> ExtractText(Bitmap bmp, Language? preferredLanguage, System.Windows.Point? singlePoint = null)
{ {
Language? selectedLanguage = GetOCRLanguage(); Language? selectedLanguage = preferredLanguage;
if (selectedLanguage == null)
{
selectedLanguage = GetOCRLanguage();
}
if (selectedLanguage == null) if (selectedLanguage == null)
{ {
return string.Empty; return string.Empty;

View File

@@ -45,12 +45,7 @@
Color="Black" /> Color="Black" />
</Canvas.Background> </Canvas.Background>
<Canvas.ContextMenu> <Canvas.ContextMenu>
<ContextMenu> <ContextMenu x:Name="CanvasContextMenu" />
<MenuItem
Name="CancelMenuItem"
Click="CancelMenuItem_Click"
Header="Cancel" />
</ContextMenu>
</Canvas.ContextMenu> </Canvas.ContextMenu>
</Canvas> </Canvas>
</Grid> </Grid>

View File

@@ -3,6 +3,8 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
@@ -10,6 +12,8 @@ using System.Windows.Media;
using Microsoft.PowerToys.Telemetry; using Microsoft.PowerToys.Telemetry;
using PowerOCR.Helpers; using PowerOCR.Helpers;
using PowerOCR.Utilities; using PowerOCR.Utilities;
using Windows.Globalization;
using Windows.Media.Ocr;
namespace PowerOCR; namespace PowerOCR;
@@ -30,6 +34,9 @@ public partial class OCROverlay : Window
private Point GetMousePos() => PointToScreen(Mouse.GetPosition(this)); private Point GetMousePos() => PointToScreen(Mouse.GetPosition(this));
private Language? selectedLanguage = null;
private MenuItem cancelMenuItem;
private System.Windows.Forms.Screen? CurrentScreen private System.Windows.Forms.Screen? CurrentScreen
{ {
get; get;
@@ -47,6 +54,40 @@ public partial class OCROverlay : Window
public OCROverlay() public OCROverlay()
{ {
InitializeComponent(); InitializeComponent();
// build context menu
selectedLanguage = ImageMethods.GetOCRLanguage();
string? selectedLanguageName = selectedLanguage?.DisplayName;
List<Language> 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) private void Window_Loaded(object sender, RoutedEventArgs e)
@@ -78,7 +119,7 @@ public partial class OCROverlay : Window
RegionClickCanvas.MouseUp -= RegionClickCanvas_MouseUp; RegionClickCanvas.MouseUp -= RegionClickCanvas_MouseUp;
RegionClickCanvas.MouseMove -= RegionClickCanvas_MouseMove; RegionClickCanvas.MouseMove -= RegionClickCanvas_MouseMove;
CancelMenuItem.Click -= CancelMenuItem_Click; cancelMenuItem.Click -= CancelMenuItem_Click;
} }
private void MainWindow_KeyUp(object sender, KeyEventArgs e) private void MainWindow_KeyUp(object sender, KeyEventArgs e)
@@ -259,11 +300,11 @@ public partial class OCROverlay : Window
if (regionScaled.Width < 3 || regionScaled.Height < 3) 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 else
{ {
grabbedText = await ImageMethods.GetRegionsText(this, regionScaled); grabbedText = await ImageMethods.GetRegionsText(this, regionScaled, selectedLanguage);
} }
if (string.IsNullOrWhiteSpace(grabbedText) == false) if (string.IsNullOrWhiteSpace(grabbedText) == false)

View File

@@ -2559,6 +2559,9 @@ Activate by holding the key for the character you want to add an accent to, then
<data name="LearnMore_TextExtractor.Text" xml:space="preserve"> <data name="LearnMore_TextExtractor.Text" xml:space="preserve">
<value>Learn more about Text Extractor</value> <value>Learn more about Text Extractor</value>
</data> </data>
<data name="TextExtractor_Cancel" xml:space="preserve">
<value>cancel</value>
</data>
<data name="General_SettingsBackupAndRestore_NothingToBackup" xml:space="preserve"> <data name="General_SettingsBackupAndRestore_NothingToBackup" xml:space="preserve">
<value>A new backup was not created because no settings have been changed since last backup.</value> <value>A new backup was not created because no settings have been changed since last backup.</value>
</data> </data>