mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-09 12:46:47 +02:00
[TextExtractor]Select OCR language in context menu (#22777)
* TextExtractor Add language selection. * TextExtractor adding resources
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user