mirror of
https://github.com/greenshot/greenshot
synced 2025-08-21 05:53:27 -07:00
Added Additional Comments for Code Readability Win10OcrProvider.cs
This commit introduces more inline comments to the Win10OcrProvider class. These comments aim to improve the understanding of the class functions and the flow of the OCR process. Key areas clarified include: 1. Logging of available OCR languages. 2. Handling of image sizing before OCR process. 3. The OCR process itself and the creation of the OCR result.
This commit is contained in:
parent
ef9443b016
commit
9a609e9ef3
1 changed files with 27 additions and 3 deletions
|
@ -41,7 +41,10 @@ namespace Greenshot.Plugin.Win10
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Win10OcrProvider : IOcrProvider
|
public class Win10OcrProvider : IOcrProvider
|
||||||
{
|
{
|
||||||
|
// Log for debugging and information
|
||||||
private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Win10OcrProvider));
|
private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Win10OcrProvider));
|
||||||
|
|
||||||
|
// Minimum width and height for the OCR to work correctly
|
||||||
private const int MinWidth = 130;
|
private const int MinWidth = 130;
|
||||||
private const int MinHeight = 130;
|
private const int MinHeight = 130;
|
||||||
|
|
||||||
|
@ -50,7 +53,10 @@ namespace Greenshot.Plugin.Win10
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Win10OcrProvider()
|
public Win10OcrProvider()
|
||||||
{
|
{
|
||||||
|
// Get available languages from the OCR engine and log them
|
||||||
var languages = OcrEngine.AvailableRecognizerLanguages;
|
var languages = OcrEngine.AvailableRecognizerLanguages;
|
||||||
|
|
||||||
|
// Log all available languages for OCR.
|
||||||
foreach (var language in languages)
|
foreach (var language in languages)
|
||||||
{
|
{
|
||||||
Log.DebugFormat("Found language {0} {1}", language.NativeName, language.LanguageTag);
|
Log.DebugFormat("Found language {0} {1}", language.NativeName, language.LanguageTag);
|
||||||
|
@ -64,19 +70,26 @@ namespace Greenshot.Plugin.Win10
|
||||||
/// <returns>OcrResult sync</returns>
|
/// <returns>OcrResult sync</returns>
|
||||||
public async Task<OcrInformation> DoOcrAsync(ISurface surface)
|
public async Task<OcrInformation> DoOcrAsync(ISurface surface)
|
||||||
{
|
{
|
||||||
|
// Will contain the result of the OCR process
|
||||||
OcrInformation result;
|
OcrInformation result;
|
||||||
|
|
||||||
|
// Using a memory stream to handle the image
|
||||||
using (var imageStream = new MemoryStream())
|
using (var imageStream = new MemoryStream())
|
||||||
{
|
{
|
||||||
// We only want the background
|
// We only want the background
|
||||||
|
// Output settings for the image before OCR process
|
||||||
var outputSettings = new SurfaceOutputSettings(OutputFormat.png, 0, true)
|
var outputSettings = new SurfaceOutputSettings(OutputFormat.png, 0, true)
|
||||||
{
|
{
|
||||||
ReduceColors = true,
|
ReduceColors = true,
|
||||||
SaveBackgroundOnly = true
|
SaveBackgroundOnly = true
|
||||||
};
|
};
|
||||||
// Force Grayscale output
|
// Force Grayscale output to the image
|
||||||
outputSettings.Effects.Add(new GrayscaleEffect());
|
outputSettings.Effects.Add(new GrayscaleEffect());
|
||||||
|
|
||||||
|
// If the surface is smaller than the minimum dimensions, resize it
|
||||||
if (surface.Image.Width < MinWidth || surface.Image.Height < MinHeight)
|
if (surface.Image.Width < MinWidth || surface.Image.Height < MinHeight)
|
||||||
{
|
{
|
||||||
|
// Calculate dimensions to add
|
||||||
int addedWidth = MinWidth - surface.Image.Width;
|
int addedWidth = MinWidth - surface.Image.Width;
|
||||||
if (addedWidth < 0)
|
if (addedWidth < 0)
|
||||||
{
|
{
|
||||||
|
@ -95,13 +108,18 @@ namespace Greenshot.Plugin.Win10
|
||||||
{
|
{
|
||||||
addedHeight /= 2;
|
addedHeight /= 2;
|
||||||
}
|
}
|
||||||
|
// Add a resize effect to the image
|
||||||
IEffect effect = new ResizeCanvasEffect(addedWidth, addedWidth, addedHeight, addedHeight);
|
IEffect effect = new ResizeCanvasEffect(addedWidth, addedWidth, addedHeight, addedHeight);
|
||||||
outputSettings.Effects.Add(effect);
|
outputSettings.Effects.Add(effect);
|
||||||
}
|
}
|
||||||
|
// Save the surface to the stream and reset position
|
||||||
ImageIO.SaveToStream(surface, imageStream, outputSettings);
|
ImageIO.SaveToStream(surface, imageStream, outputSettings);
|
||||||
imageStream.Position = 0;
|
imageStream.Position = 0;
|
||||||
|
|
||||||
|
// Create a random access stream from the memory stream
|
||||||
var randomAccessStream = imageStream.AsRandomAccessStream();
|
var randomAccessStream = imageStream.AsRandomAccessStream();
|
||||||
|
|
||||||
|
// Perform OCR on the stream
|
||||||
result = await DoOcrAsync(randomAccessStream);
|
result = await DoOcrAsync(randomAccessStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,8 +176,10 @@ namespace Greenshot.Plugin.Win10
|
||||||
{
|
{
|
||||||
var result = new OcrInformation();
|
var result = new OcrInformation();
|
||||||
|
|
||||||
|
// Iterate over all lines in the OCR result
|
||||||
foreach (var ocrLine in ocrResult.Lines)
|
foreach (var ocrLine in ocrResult.Lines)
|
||||||
{
|
{
|
||||||
|
// Create a new line and add it to the result
|
||||||
var line = new Line(ocrLine.Words.Count)
|
var line = new Line(ocrLine.Words.Count)
|
||||||
{
|
{
|
||||||
Text = ocrLine.Text
|
Text = ocrLine.Text
|
||||||
|
@ -167,12 +187,16 @@ namespace Greenshot.Plugin.Win10
|
||||||
|
|
||||||
result.Lines.Add(line);
|
result.Lines.Add(line);
|
||||||
|
|
||||||
|
// Loop through each word in the line and process it.
|
||||||
for (var index = 0; index < ocrLine.Words.Count; index++)
|
for (var index = 0; index < ocrLine.Words.Count; index++)
|
||||||
{
|
{
|
||||||
var ocrWord = ocrLine.Words[index];
|
var ocrWord = ocrLine.Words[index];
|
||||||
|
|
||||||
|
// Create the bounding rectangle for the word
|
||||||
var location = new NativeRect((int) ocrWord.BoundingRect.X, (int) ocrWord.BoundingRect.Y,
|
var location = new NativeRect((int) ocrWord.BoundingRect.X, (int) ocrWord.BoundingRect.Y,
|
||||||
(int) ocrWord.BoundingRect.Width, (int) ocrWord.BoundingRect.Height);
|
(int) ocrWord.BoundingRect.Width, (int) ocrWord.BoundingRect.Height);
|
||||||
|
|
||||||
|
// Add the word to the line
|
||||||
var word = line.Words[index];
|
var word = line.Words[index];
|
||||||
word.Text = ocrWord.Text;
|
word.Text = ocrWord.Text;
|
||||||
word.Bounds = location;
|
word.Bounds = location;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue