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.btnOpenOCRHelp = new System.Windows.Forms.Button();
this.lblService = new System.Windows.Forms.Label(); this.lblService = new System.Windows.Forms.Label();
this.btnSelectRegion = new System.Windows.Forms.Button(); this.btnSelectRegion = new System.Windows.Forms.Button();
this.cbSingleLine = new System.Windows.Forms.CheckBox();
((System.ComponentModel.ISupportInitialize)(this.nudScaleFactor)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nudScaleFactor)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
// //
@ -130,10 +131,18 @@ private void InitializeComponent()
this.btnSelectRegion.UseVisualStyleBackColor = true; this.btnSelectRegion.UseVisualStyleBackColor = true;
this.btnSelectRegion.Click += new System.EventHandler(this.btnSelectRegion_Click); 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 // OCRForm
// //
resources.ApplyResources(this, "$this"); resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.cbSingleLine);
this.Controls.Add(this.lblService); this.Controls.Add(this.lblService);
this.Controls.Add(this.btnOpenOCRHelp); this.Controls.Add(this.btnOpenOCRHelp);
this.Controls.Add(this.btnSelectRegion); this.Controls.Add(this.btnSelectRegion);
@ -169,5 +178,6 @@ private void InitializeComponent()
private System.Windows.Forms.Button btnOpenOCRHelp; private System.Windows.Forms.Button btnOpenOCRHelp;
private System.Windows.Forms.Label lblService; private System.Windows.Forms.Label lblService;
private System.Windows.Forms.Button btnSelectRegion; 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); nudScaleFactor.SetValue((decimal)Options.ScaleFactor);
cbSingleLine.Checked = Options.SingleLine;
if (Options.ServiceLinks == null || Options.IsDefaultServiceLinks()) if (Options.ServiceLinks == null || Options.IsDefaultServiceLinks())
{ {
@ -141,7 +142,7 @@ private async Task OCR(Bitmap bmp)
try 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)) 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) private void cbServices_SelectedIndexChanged(object sender, EventArgs e)
{ {
Options.SelectedServiceLink = cbServices.SelectedIndex; Options.SelectedServiceLink = cbServices.SelectedIndex;

View file

@ -147,7 +147,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;lblLanguage.ZOrder" xml:space="preserve"> <data name="&gt;&gt;lblLanguage.ZOrder" xml:space="preserve">
<value>11</value> <value>12</value>
</data> </data>
<data name="cbLanguages.Font" type="System.Drawing.Font, System.Drawing"> <data name="cbLanguages.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value> <value>Microsoft Sans Serif, 9.75pt</value>
@ -171,7 +171,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;cbLanguages.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cbLanguages.ZOrder" xml:space="preserve">
<value>10</value> <value>11</value>
</data> </data>
<data name="lblResult.AutoSize" type="System.Boolean, mscorlib"> <data name="lblResult.AutoSize" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
@ -201,7 +201,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;lblResult.ZOrder" xml:space="preserve"> <data name="&gt;&gt;lblResult.ZOrder" xml:space="preserve">
<value>9</value> <value>10</value>
</data> </data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <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"> <data name="txtResult.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
@ -235,7 +235,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;txtResult.ZOrder" xml:space="preserve"> <data name="&gt;&gt;txtResult.ZOrder" xml:space="preserve">
<value>8</value> <value>9</value>
</data> </data>
<data name="lblScaleFactor.AutoSize" type="System.Boolean, mscorlib"> <data name="lblScaleFactor.AutoSize" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
@ -265,7 +265,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;lblScaleFactor.ZOrder" xml:space="preserve"> <data name="&gt;&gt;lblScaleFactor.ZOrder" xml:space="preserve">
<value>7</value> <value>8</value>
</data> </data>
<data name="nudScaleFactor.Font" type="System.Drawing.Font, System.Drawing"> <data name="nudScaleFactor.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value> <value>Microsoft Sans Serif, 9.75pt</value>
@ -292,13 +292,13 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;nudScaleFactor.ZOrder" xml:space="preserve"> <data name="&gt;&gt;nudScaleFactor.ZOrder" xml:space="preserve">
<value>6</value> <value>7</value>
</data> </data>
<data name="cbServices.Font" type="System.Drawing.Font, System.Drawing"> <data name="cbServices.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value> <value>Microsoft Sans Serif, 9.75pt</value>
</data> </data>
<data name="cbServices.Location" type="System.Drawing.Point, System.Drawing"> <data name="cbServices.Location" type="System.Drawing.Point, System.Drawing">
<value>16, 192</value> <value>16, 216</value>
</data> </data>
<data name="cbServices.Size" type="System.Drawing.Size, System.Drawing"> <data name="cbServices.Size" type="System.Drawing.Size, System.Drawing">
<value>272, 24</value> <value>272, 24</value>
@ -316,7 +316,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;cbServices.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cbServices.ZOrder" xml:space="preserve">
<value>5</value> <value>6</value>
</data> </data>
<data name="btnOpenServiceLink.Enabled" type="System.Boolean, mscorlib"> <data name="btnOpenServiceLink.Enabled" type="System.Boolean, mscorlib">
<value>False</value> <value>False</value>
@ -325,7 +325,7 @@
<value>Microsoft Sans Serif, 9.75pt</value> <value>Microsoft Sans Serif, 9.75pt</value>
</data> </data>
<data name="btnOpenServiceLink.Location" type="System.Drawing.Point, System.Drawing"> <data name="btnOpenServiceLink.Location" type="System.Drawing.Point, System.Drawing">
<value>16, 224</value> <value>16, 248</value>
</data> </data>
<data name="btnOpenServiceLink.Size" type="System.Drawing.Size, System.Drawing"> <data name="btnOpenServiceLink.Size" type="System.Drawing.Size, System.Drawing">
<value>272, 32</value> <value>272, 32</value>
@ -346,10 +346,10 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;btnOpenServiceLink.ZOrder" xml:space="preserve"> <data name="&gt;&gt;btnOpenServiceLink.ZOrder" xml:space="preserve">
<value>4</value> <value>5</value>
</data> </data>
<data name="cbEditServices.Location" type="System.Drawing.Point, System.Drawing"> <data name="cbEditServices.Location" type="System.Drawing.Point, System.Drawing">
<value>296, 190</value> <value>296, 214</value>
</data> </data>
<data name="cbEditServices.Size" type="System.Drawing.Size, System.Drawing"> <data name="cbEditServices.Size" type="System.Drawing.Size, System.Drawing">
<value>28, 28</value> <value>28, 28</value>
@ -367,7 +367,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;cbEditServices.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cbEditServices.ZOrder" xml:space="preserve">
<value>3</value> <value>4</value>
</data> </data>
<data name="btnOpenOCRHelp.Font" type="System.Drawing.Font, System.Drawing"> <data name="btnOpenOCRHelp.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value> <value>Microsoft Sans Serif, 9.75pt</value>
@ -391,7 +391,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;btnOpenOCRHelp.ZOrder" xml:space="preserve"> <data name="&gt;&gt;btnOpenOCRHelp.ZOrder" xml:space="preserve">
<value>1</value> <value>2</value>
</data> </data>
<data name="lblService.AutoSize" type="System.Boolean, mscorlib"> <data name="lblService.AutoSize" type="System.Boolean, mscorlib">
<value>True</value> <value>True</value>
@ -400,7 +400,7 @@
<value>Microsoft Sans Serif, 9.75pt</value> <value>Microsoft Sans Serif, 9.75pt</value>
</data> </data>
<data name="lblService.Location" type="System.Drawing.Point, System.Drawing"> <data name="lblService.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 168</value> <value>13, 192</value>
</data> </data>
<data name="lblService.Size" type="System.Drawing.Size, System.Drawing"> <data name="lblService.Size" type="System.Drawing.Size, System.Drawing">
<value>56, 16</value> <value>56, 16</value>
@ -421,7 +421,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;lblService.ZOrder" xml:space="preserve"> <data name="&gt;&gt;lblService.ZOrder" xml:space="preserve">
<value>0</value> <value>1</value>
</data> </data>
<data name="btnSelectRegion.Font" type="System.Drawing.Font, System.Drawing"> <data name="btnSelectRegion.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 9.75pt</value> <value>Microsoft Sans Serif, 9.75pt</value>
@ -451,7 +451,37 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;btnSelectRegion.ZOrder" xml:space="preserve"> <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> </data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value> <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(); 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 bmpClone = (Bitmap)bmp.Clone())
using (Bitmap bmpScaled = ImageHelpers.ResizeImage(bmpClone, (int)(bmpClone.Width * scaleFactor), (int)(bmpClone.Height * scaleFactor))) 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); 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); OcrResult ocrResult = await engine.RecognizeAsync(softwareBitmap);
string separator;
if (singleLine)
{
separator = " ";
}
else
{
separator = Environment.NewLine;
}
if (language.LanguageTag.StartsWith("zh", StringComparison.OrdinalIgnoreCase) || // Chinese if (language.LanguageTag.StartsWith("zh", StringComparison.OrdinalIgnoreCase) || // Chinese
language.LanguageTag.StartsWith("ja", StringComparison.OrdinalIgnoreCase) || // Japanese language.LanguageTag.StartsWith("ja", StringComparison.OrdinalIgnoreCase) || // Japanese
language.LanguageTag.StartsWith("ko", StringComparison.OrdinalIgnoreCase)) // Korean language.LanguageTag.StartsWith("ko", StringComparison.OrdinalIgnoreCase)) // Korean
{ {
// If CJK language then remove spaces between words. // 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) else if (language.LayoutDirection == LanguageLayoutDirection.Rtl)
{ {
// If RTL language then reverse order of words. // 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 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 string Language { get; set; } = "en";
public float ScaleFactor { get; set; } = 2f; public float ScaleFactor { get; set; } = 2f;
public bool SingleLine { get; set; } = false;
public bool Silent { get; set; } = false; public bool Silent { get; set; } = false;
public bool AutoCopy { get; set; } = false; public bool AutoCopy { get; set; } = false;
public List<ServiceLink> ServiceLinks { get; set; } = DefaultServiceLinks; 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) 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)) if (!string.IsNullOrEmpty(result))