Added single line option to OCR window

This commit is contained in:
Jaex 2022-07-11 12:21:39 +03:00
parent 82ffe63f45
commit 69ad13f680
6 changed files with 87 additions and 24 deletions

View file

@ -28,6 +28,7 @@ private void InitializeComponent()
this.btnOpenOCRHelp = new System.Windows.Forms.Button();
this.lblService = new System.Windows.Forms.Label();
this.btnSelectRegion = new System.Windows.Forms.Button();
this.cbSingleLine = new System.Windows.Forms.CheckBox();
((System.ComponentModel.ISupportInitialize)(this.nudScaleFactor)).BeginInit();
this.SuspendLayout();
//
@ -130,10 +131,18 @@ private void InitializeComponent()
this.btnSelectRegion.UseVisualStyleBackColor = true;
this.btnSelectRegion.Click += new System.EventHandler(this.btnSelectRegion_Click);
//
// cbSingleLine
//
resources.ApplyResources(this.cbSingleLine, "cbSingleLine");
this.cbSingleLine.Name = "cbSingleLine";
this.cbSingleLine.UseVisualStyleBackColor = true;
this.cbSingleLine.CheckedChanged += new System.EventHandler(this.cbSingleLine_CheckedChanged);
//
// OCRForm
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.cbSingleLine);
this.Controls.Add(this.lblService);
this.Controls.Add(this.btnOpenOCRHelp);
this.Controls.Add(this.btnSelectRegion);
@ -169,5 +178,6 @@ private void InitializeComponent()
private System.Windows.Forms.Button btnOpenOCRHelp;
private System.Windows.Forms.Label lblService;
private System.Windows.Forms.Button btnSelectRegion;
private System.Windows.Forms.CheckBox cbSingleLine;
}
}

View file

@ -82,6 +82,7 @@ public OCRForm(Bitmap bmp, OCROptions options)
}
nudScaleFactor.SetValue((decimal)Options.ScaleFactor);
cbSingleLine.Checked = Options.SingleLine;
if (Options.ServiceLinks == null || Options.IsDefaultServiceLinks())
{
@ -141,7 +142,7 @@ private async Task OCR(Bitmap bmp)
try
{
Result = await OCRHelper.OCR(bmp, Options.Language, Options.ScaleFactor);
Result = await OCRHelper.OCR(bmp, Options.Language, Options.ScaleFactor, Options.SingleLine);
if (Options.AutoCopy && !string.IsNullOrEmpty(Result))
{
@ -211,6 +212,16 @@ private async void nudScaleFactor_ValueChanged(object sender, EventArgs e)
}
}
private async void cbSingleLine_CheckedChanged(object sender, EventArgs e)
{
if (loaded)
{
Options.SingleLine = cbSingleLine.Checked;
await OCR(bmpSource);
}
}
private void cbServices_SelectedIndexChanged(object sender, EventArgs e)
{
Options.SelectedServiceLink = cbServices.SelectedIndex;

View file

@ -147,7 +147,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;lblLanguage.ZOrder" xml:space="preserve">
<value>11</value>
<value>12</value>
</data>
<data name="cbLanguages.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value>
@ -171,7 +171,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;cbLanguages.ZOrder" xml:space="preserve">
<value>10</value>
<value>11</value>
</data>
<data name="lblResult.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -201,7 +201,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;lblResult.ZOrder" xml:space="preserve">
<value>9</value>
<value>10</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="txtResult.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
@ -235,7 +235,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;txtResult.ZOrder" xml:space="preserve">
<value>8</value>
<value>9</value>
</data>
<data name="lblScaleFactor.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -265,7 +265,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;lblScaleFactor.ZOrder" xml:space="preserve">
<value>7</value>
<value>8</value>
</data>
<data name="nudScaleFactor.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value>
@ -292,13 +292,13 @@
<value>$this</value>
</data>
<data name="&gt;&gt;nudScaleFactor.ZOrder" xml:space="preserve">
<value>6</value>
<value>7</value>
</data>
<data name="cbServices.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value>
</data>
<data name="cbServices.Location" type="System.Drawing.Point, System.Drawing">
<value>16, 192</value>
<value>16, 216</value>
</data>
<data name="cbServices.Size" type="System.Drawing.Size, System.Drawing">
<value>272, 24</value>
@ -316,7 +316,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;cbServices.ZOrder" xml:space="preserve">
<value>5</value>
<value>6</value>
</data>
<data name="btnOpenServiceLink.Enabled" type="System.Boolean, mscorlib">
<value>False</value>
@ -325,7 +325,7 @@
<value>Microsoft Sans Serif, 9.75pt</value>
</data>
<data name="btnOpenServiceLink.Location" type="System.Drawing.Point, System.Drawing">
<value>16, 224</value>
<value>16, 248</value>
</data>
<data name="btnOpenServiceLink.Size" type="System.Drawing.Size, System.Drawing">
<value>272, 32</value>
@ -346,10 +346,10 @@
<value>$this</value>
</data>
<data name="&gt;&gt;btnOpenServiceLink.ZOrder" xml:space="preserve">
<value>4</value>
<value>5</value>
</data>
<data name="cbEditServices.Location" type="System.Drawing.Point, System.Drawing">
<value>296, 190</value>
<value>296, 214</value>
</data>
<data name="cbEditServices.Size" type="System.Drawing.Size, System.Drawing">
<value>28, 28</value>
@ -367,7 +367,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;cbEditServices.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="btnOpenOCRHelp.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value>
@ -391,7 +391,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;btnOpenOCRHelp.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="lblService.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -400,7 +400,7 @@
<value>Microsoft Sans Serif, 9.75pt</value>
</data>
<data name="lblService.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 168</value>
<value>13, 192</value>
</data>
<data name="lblService.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 16</value>
@ -421,7 +421,7 @@
<value>$this</value>
</data>
<data name="&gt;&gt;lblService.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="btnSelectRegion.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value>
@ -451,7 +451,37 @@
<value>$this</value>
</data>
<data name="&gt;&gt;btnSelectRegion.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="cbSingleLine.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="cbSingleLine.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value>
</data>
<data name="cbSingleLine.Location" type="System.Drawing.Point, System.Drawing">
<value>16, 168</value>
</data>
<data name="cbSingleLine.Size" type="System.Drawing.Size, System.Drawing">
<value>88, 20</value>
</data>
<data name="cbSingleLine.TabIndex" type="System.Int32, mscorlib">
<value>12</value>
</data>
<data name="cbSingleLine.Text" xml:space="preserve">
<value>Single line</value>
</data>
<data name="&gt;&gt;cbSingleLine.Name" xml:space="preserve">
<value>cbSingleLine</value>
</data>
<data name="&gt;&gt;cbSingleLine.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;cbSingleLine.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;cbSingleLine.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>

View file

@ -69,7 +69,7 @@ public static void ThrowIfNotSupported()
}
}
public static async Task<string> OCR(Bitmap bmp, string languageTag = "en", float scaleFactor = 1f)
public static async Task<string> OCR(Bitmap bmp, string languageTag = "en", float scaleFactor = 1f, bool singleLine = false)
{
ThrowIfNotSupported();
@ -80,12 +80,12 @@ public static async Task<string> OCR(Bitmap bmp, string languageTag = "en", floa
using (Bitmap bmpClone = (Bitmap)bmp.Clone())
using (Bitmap bmpScaled = ImageHelpers.ResizeImage(bmpClone, (int)(bmpClone.Width * scaleFactor), (int)(bmpClone.Height * scaleFactor)))
{
return await OCRInternal(bmpScaled, languageTag);
return await OCRInternal(bmpScaled, languageTag, singleLine);
}
});
}
private static async Task<string> OCRInternal(Bitmap bmp, string languageTag)
private static async Task<string> OCRInternal(Bitmap bmp, string languageTag, bool singleLine = false)
{
Language language = new Language(languageTag);
@ -105,21 +105,32 @@ private static async Task<string> OCRInternal(Bitmap bmp, string languageTag)
{
OcrResult ocrResult = await engine.RecognizeAsync(softwareBitmap);
string separator;
if (singleLine)
{
separator = " ";
}
else
{
separator = Environment.NewLine;
}
if (language.LanguageTag.StartsWith("zh", StringComparison.OrdinalIgnoreCase) || // Chinese
language.LanguageTag.StartsWith("ja", StringComparison.OrdinalIgnoreCase) || // Japanese
language.LanguageTag.StartsWith("ko", StringComparison.OrdinalIgnoreCase)) // Korean
{
// If CJK language then remove spaces between words.
return string.Join("\r\n", ocrResult.Lines.Select(line => string.Concat(line.Words.Select(word => word.Text))));
return string.Join(separator, ocrResult.Lines.Select(line => string.Concat(line.Words.Select(word => word.Text))));
}
else if (language.LayoutDirection == LanguageLayoutDirection.Rtl)
{
// If RTL language then reverse order of words.
return string.Join("\r\n", ocrResult.Lines.Select(line => string.Join(" ", line.Words.Reverse().Select(word => word.Text))));
return string.Join(separator, ocrResult.Lines.Select(line => string.Join(" ", line.Words.Reverse().Select(word => word.Text))));
}
else
{
return string.Join("\r\n", ocrResult.Lines.Select(line => line.Text));
return string.Join(separator, ocrResult.Lines.Select(line => line.Text));
}
}
}

View file

@ -32,6 +32,7 @@ public class OCROptions
{
public string Language { get; set; } = "en";
public float ScaleFactor { get; set; } = 2f;
public bool SingleLine { get; set; } = false;
public bool Silent { get; set; } = false;
public bool AutoCopy { get; set; } = false;
public List<ServiceLink> ServiceLinks { get; set; } = DefaultServiceLinks;

View file

@ -1250,7 +1250,7 @@ private static async Task AsyncOCRImage(Bitmap bmp, OCROptions options, string f
if (bmp != null)
{
result = await OCRHelper.OCR(bmp, options.Language, options.ScaleFactor);
result = await OCRHelper.OCR(bmp, options.Language, options.ScaleFactor, options.SingleLine);
}
if (!string.IsNullOrEmpty(result))