mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-04 18:26:39 +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);
|
||||
}
|
||||
|
||||
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 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<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);
|
||||
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<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)
|
||||
{
|
||||
return string.Empty;
|
||||
|
||||
@@ -45,12 +45,7 @@
|
||||
Color="Black" />
|
||||
</Canvas.Background>
|
||||
<Canvas.ContextMenu>
|
||||
<ContextMenu>
|
||||
<MenuItem
|
||||
Name="CancelMenuItem"
|
||||
Click="CancelMenuItem_Click"
|
||||
Header="Cancel" />
|
||||
</ContextMenu>
|
||||
<ContextMenu x:Name="CanvasContextMenu" />
|
||||
</Canvas.ContextMenu>
|
||||
</Canvas>
|
||||
</Grid>
|
||||
|
||||
@@ -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<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)
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user