From dad5b81096097b985895a9058f7b969294d2b346 Mon Sep 17 00:00:00 2001 From: Luke Anderson Date: Thu, 15 Nov 2018 11:40:54 +1030 Subject: [PATCH] Add new settings to OCR - Fixes #3712, #3601, #2848 --- .../Forms/OCRSpaceForm.Designer.cs | 1 + ShareX.UploadersLib/Forms/OCRSpaceForm.cs | 19 ++- ShareX/ApplicationConfig.cs | 6 - ShareX/Forms/TaskSettingsForm.Designer.cs | 41 +++++++ ShareX/Forms/TaskSettingsForm.cs | 26 +++++ ShareX/Forms/TaskSettingsForm.resx | 108 ++++++++++++++++++ ShareX/Properties/Resources.Designer.cs | 27 +++++ ShareX/Properties/Resources.resx | 9 ++ ShareX/TaskHelpers.cs | 49 +++++--- ShareX/TaskSettings.cs | 7 ++ ShareX/UploadInfoManager.cs | 2 +- ShareX/WorkerTask.cs | 2 +- 12 files changed, 270 insertions(+), 27 deletions(-) diff --git a/ShareX.UploadersLib/Forms/OCRSpaceForm.Designer.cs b/ShareX.UploadersLib/Forms/OCRSpaceForm.Designer.cs index db7dcc5e1..7f2f646ec 100644 --- a/ShareX.UploadersLib/Forms/OCRSpaceForm.Designer.cs +++ b/ShareX.UploadersLib/Forms/OCRSpaceForm.Designer.cs @@ -56,6 +56,7 @@ private void InitializeComponent() // resources.ApplyResources(this.txtResult, "txtResult"); this.txtResult.Name = "txtResult"; + this.txtResult.ReadOnly = true; // // lblResult // diff --git a/ShareX.UploadersLib/Forms/OCRSpaceForm.cs b/ShareX.UploadersLib/Forms/OCRSpaceForm.cs index beb3d91da..a62f42140 100644 --- a/ShareX.UploadersLib/Forms/OCRSpaceForm.cs +++ b/ShareX.UploadersLib/Forms/OCRSpaceForm.cs @@ -25,6 +25,7 @@ You should have received a copy of the GNU General Public License using ShareX.HelpersLib; using ShareX.UploadersLib.OtherServices; +using ShareX.UploadersLib.Properties; using System; using System.IO; using System.Threading.Tasks; @@ -34,24 +35,28 @@ namespace ShareX.UploadersLib { public partial class OCRSpaceForm : Form { - public OCRSpaceLanguages Language { get; set; } = OCRSpaceLanguages.eng; + public OCRSpaceLanguages Language { get; set; } public string Result { get; private set; } private Stream data; private string filename; + private OCROptions ocrOptions; - public OCRSpaceForm() + public OCRSpaceForm(OCROptions ocrOptions) { InitializeComponent(); Icon = ShareXResources.Icon; cbLanguages.Items.AddRange(Helpers.GetEnumDescriptions()); + cbLanguages.SelectedIndex = (int)ocrOptions.DefaultLanguage; + Language = ocrOptions.DefaultLanguage; txtResult.SupportSelectAll(); } - public OCRSpaceForm(Stream data, string filename) : this() + public OCRSpaceForm(Stream data, string filename, OCROptions ocrOptions) : this(ocrOptions) { this.data = data; this.filename = filename; + this.ocrOptions = ocrOptions; } private async void OCRSpaceResultForm_Shown(object sender, EventArgs e) @@ -76,7 +81,7 @@ private void UpdateControls() btnStartOCR.Visible = data != null && data.Length > 0 && !string.IsNullOrEmpty(filename); } - private async Task StartOCR(Stream stream, string filename) + public async Task StartOCR(Stream stream, string filename) { if (stream != null && stream.Length > 0 && !string.IsNullOrEmpty(filename)) { @@ -133,4 +138,10 @@ private void llGoogleTranslate_LinkClicked(object sender, LinkLabelLinkClickedEv Close(); } } + + public class OCROptions + { + public OCRSpaceLanguages DefaultLanguage = OCRSpaceLanguages.eng; + public bool Silent = false; + } } \ No newline at end of file diff --git a/ShareX/ApplicationConfig.cs b/ShareX/ApplicationConfig.cs index 003d05904..d7a65dd5a 100644 --- a/ShareX/ApplicationConfig.cs +++ b/ShareX/ApplicationConfig.cs @@ -284,12 +284,6 @@ public int HotkeyRepeatLimit #endregion Webpage Capture Form - #region OCR Form - - public OCRSpaceLanguages OCRLanguage = OCRSpaceLanguages.eng; - - #endregion OCR Form - #region Actions toolbar public List ActionsToolbarList = new List() { HotkeyType.RectangleRegion, HotkeyType.PrintScreen, HotkeyType.ScreenRecorder, diff --git a/ShareX/Forms/TaskSettingsForm.Designer.cs b/ShareX/Forms/TaskSettingsForm.Designer.cs index 5b432a95c..1d31053c7 100644 --- a/ShareX/Forms/TaskSettingsForm.Designer.cs +++ b/ShareX/Forms/TaskSettingsForm.Designer.cs @@ -175,6 +175,10 @@ private void InitializeComponent() this.cbScreenRecorderFixedDuration = new System.Windows.Forms.CheckBox(); this.nudGIFFPS = new System.Windows.Forms.NumericUpDown(); this.lblGIFFPS = new System.Windows.Forms.Label(); + this.tpOCR = new System.Windows.Forms.TabPage(); + this.cbCaptureOCRSilent = new System.Windows.Forms.CheckBox(); + this.lblOCRDefaultLanguage = new System.Windows.Forms.Label(); + this.cbCaptureOCRDefaultLanguage = new System.Windows.Forms.ComboBox(); this.tpUpload = new System.Windows.Forms.TabPage(); this.tcUpload = new System.Windows.Forms.TabControl(); this.tpUploadMain = new System.Windows.Forms.TabPage(); @@ -279,6 +283,7 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.nudScreenRecorderDuration)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nudScreenRecorderStartDelay)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nudGIFFPS)).BeginInit(); + this.tpOCR.SuspendLayout(); this.tpUpload.SuspendLayout(); this.tcUpload.SuspendLayout(); this.tpUploadMain.SuspendLayout(); @@ -805,6 +810,7 @@ private void InitializeComponent() this.tcCapture.Controls.Add(this.tpCaptureGeneral); this.tcCapture.Controls.Add(this.tpRegionCapture); this.tcCapture.Controls.Add(this.tpScreenRecorder); + this.tcCapture.Controls.Add(this.tpOCR); resources.ApplyResources(this.tcCapture, "tcCapture"); this.tcCapture.Name = "tcCapture"; this.tcCapture.SelectedIndex = 0; @@ -1576,6 +1582,35 @@ private void InitializeComponent() resources.ApplyResources(this.lblGIFFPS, "lblGIFFPS"); this.lblGIFFPS.Name = "lblGIFFPS"; // + // tpOCR + // + this.tpOCR.Controls.Add(this.cbCaptureOCRSilent); + this.tpOCR.Controls.Add(this.lblOCRDefaultLanguage); + this.tpOCR.Controls.Add(this.cbCaptureOCRDefaultLanguage); + resources.ApplyResources(this.tpOCR, "tpOCR"); + this.tpOCR.Name = "tpOCR"; + this.tpOCR.UseVisualStyleBackColor = true; + // + // cbCaptureOCRSilent + // + resources.ApplyResources(this.cbCaptureOCRSilent, "cbCaptureOCRSilent"); + this.cbCaptureOCRSilent.Name = "cbCaptureOCRSilent"; + this.cbCaptureOCRSilent.UseVisualStyleBackColor = true; + this.cbCaptureOCRSilent.CheckedChanged += new System.EventHandler(this.cbCaptureOCRSilent_CheckedChanged); + // + // lblOCRDefaultLanguage + // + resources.ApplyResources(this.lblOCRDefaultLanguage, "lblOCRDefaultLanguage"); + this.lblOCRDefaultLanguage.Name = "lblOCRDefaultLanguage"; + // + // cbCaptureOCRDefaultLanguage + // + this.cbCaptureOCRDefaultLanguage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbCaptureOCRDefaultLanguage.FormattingEnabled = true; + resources.ApplyResources(this.cbCaptureOCRDefaultLanguage, "cbCaptureOCRDefaultLanguage"); + this.cbCaptureOCRDefaultLanguage.Name = "cbCaptureOCRDefaultLanguage"; + this.cbCaptureOCRDefaultLanguage.SelectedIndexChanged += new System.EventHandler(this.cbCaptureOCRDefaultLanguage_SelectedIndexChanged); + // // tpUpload // this.tpUpload.BackColor = System.Drawing.SystemColors.Window; @@ -2117,6 +2152,8 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.nudScreenRecorderDuration)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nudScreenRecorderStartDelay)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nudGIFFPS)).EndInit(); + this.tpOCR.ResumeLayout(false); + this.tpOCR.PerformLayout(); this.tpUpload.ResumeLayout(false); this.tcUpload.ResumeLayout(false); this.tpUploadMain.ResumeLayout(false); @@ -2354,5 +2391,9 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox cbScreenRecordConfirmAbort; private System.Windows.Forms.CheckBox cbFileUploadReplaceProblematicCharacters; private System.Windows.Forms.CheckBox cbScreenRecordTwoPassEncoding; + private System.Windows.Forms.TabPage tpOCR; + private System.Windows.Forms.Label lblOCRDefaultLanguage; + private System.Windows.Forms.ComboBox cbCaptureOCRDefaultLanguage; + private System.Windows.Forms.CheckBox cbCaptureOCRSilent; } } \ No newline at end of file diff --git a/ShareX/Forms/TaskSettingsForm.cs b/ShareX/Forms/TaskSettingsForm.cs index 0a2a53848..83bafcea6 100644 --- a/ShareX/Forms/TaskSettingsForm.cs +++ b/ShareX/Forms/TaskSettingsForm.cs @@ -28,6 +28,7 @@ You should have received a copy of the GNU General Public License using ShareX.Properties; using ShareX.ScreenCaptureLib; using ShareX.UploadersLib; +using ShareX.UploadersLib.OtherServices; using System; using System.Collections.Generic; using System.Drawing; @@ -296,6 +297,17 @@ public TaskSettingsForm(TaskSettings hotkeySetting, bool isDefault = false) #endregion Screen recorder + #region OCR + + OCROptions ocrOptions = TaskSettings.CaptureSettings.OCROptions; + + cbCaptureOCRDefaultLanguage.Items.AddRange(Helpers.GetEnumDescriptions()); + cbCaptureOCRDefaultLanguage.SelectedIndex = (int)ocrOptions.DefaultLanguage; + + cbCaptureOCRSilent.Checked = ocrOptions.Silent; + + #endregion + #endregion Capture #region Upload @@ -1097,6 +1109,20 @@ private void cbScreenRecordConfirmAbort_CheckedChanged(object sender, EventArgs #endregion Screen recorder + #region OCR + + private void cbCaptureOCRDefaultLanguage_SelectedIndexChanged(object sender, EventArgs e) + { + TaskSettings.CaptureSettings.OCROptions.DefaultLanguage = (OCRSpaceLanguages)cbCaptureOCRDefaultLanguage.SelectedIndex; + } + + private void cbCaptureOCRSilent_CheckedChanged(object sender, EventArgs e) + { + TaskSettings.CaptureSettings.OCROptions.Silent = cbCaptureOCRSilent.Checked; + } + + #endregion + #endregion Capture #region Upload diff --git a/ShareX/Forms/TaskSettingsForm.resx b/ShareX/Forms/TaskSettingsForm.resx index 850c838d7..256ebf1c8 100644 --- a/ShareX/Forms/TaskSettingsForm.resx +++ b/ShareX/Forms/TaskSettingsForm.resx @@ -3780,6 +3780,114 @@ 2 + + True + + + NoControl + + + 11, 60 + + + 124, 17 + + + 14 + + + Process OCR silently + + + cbCaptureOCRSilent + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tpOCR + + + 0 + + + True + + + NoControl + + + 8, 8 + + + 91, 13 + + + 4 + + + Default language: + + + lblOCRDefaultLanguage + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tpOCR + + + 1 + + + 11, 24 + + + 152, 21 + + + 5 + + + cbCaptureOCRDefaultLanguage + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tpOCR + + + 2 + + + 4, 22 + + + 3, 3, 3, 3 + + + 557, 447 + + + 3 + + + OCR + + + tpOCR + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tcCapture + + + 3 + Fill diff --git a/ShareX/Properties/Resources.Designer.cs b/ShareX/Properties/Resources.Designer.cs index 6e4efdd0b..052fbbc37 100644 --- a/ShareX/Properties/Resources.Designer.cs +++ b/ShareX/Properties/Resources.Designer.cs @@ -1905,6 +1905,33 @@ public static System.Drawing.Bitmap notebook { } } + /// + /// Looks up a localized string similar to The OCR output has been copied to your clipboard.. + /// + public static string OCRForm_AutoComplete { + get { + return ResourceManager.GetString("OCRForm_AutoComplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error occurred during OCR processing, or no text was returned.. + /// + public static string OCRForm_AutoCompleteFail { + get { + return ResourceManager.GetString("OCRForm_AutoCompleteFail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OCR is processing.. + /// + public static string OCRForm_AutoProcessing { + get { + return ResourceManager.GetString("OCRForm_AutoProcessing", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/ShareX/Properties/Resources.resx b/ShareX/Properties/Resources.resx index 3be3e94a8..57d57e349 100644 --- a/ShareX/Properties/Resources.resx +++ b/ShareX/Properties/Resources.resx @@ -985,4 +985,13 @@ Middle click to close Mexican Spanish + + The OCR output has been copied to your clipboard. + + + Error occurred during OCR processing, or no text was returned. + + + OCR is processing. + \ No newline at end of file diff --git a/ShareX/TaskHelpers.cs b/ShareX/TaskHelpers.cs index 804f25e1c..0a009cca2 100644 --- a/ShareX/TaskHelpers.cs +++ b/ShareX/TaskHelpers.cs @@ -31,6 +31,7 @@ You should have received a copy of the GNU General Public License using ShareX.Properties; using ShareX.ScreenCaptureLib; using ShareX.UploadersLib; +using ShareX.UploadersLib.OtherServices; using ShareX.UploadersLib.SharingServices; using System; using System.Collections.Generic; @@ -1106,52 +1107,70 @@ public static void OpenRuler(TaskSettings taskSettings = null) RegionCaptureTasks.ShowScreenRuler(taskSettings.CaptureSettings.SurfaceOptions); } + public static void SearchImage(string url) + { + new GoogleImageSearchSharingService().CreateSharer(null, null).ShareURL(url); + } + public static void OCRImage(TaskSettings taskSettings = null) { if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings(); using (Image img = RegionCaptureTasks.GetRegionImage(taskSettings.CaptureSettings.SurfaceOptions)) { - OCRImage(img); + OCRImage(img, taskSettings); } } - public static void OCRImage(Image img) + public static void OCRImage(Image img, TaskSettings taskSettings = null) { if (img != null) { using (Stream stream = SaveImageAsStream(img, EImageFormat.PNG)) { - OCRImage(stream, "ShareX.png"); + OCRImage(stream, "ShareX.png", taskSettings); } } } - public static void SearchImage(string url) - { - new GoogleImageSearchSharingService().CreateSharer(null, null).ShareURL(url); - } - - public static void OCRImage(string filePath) + public static void OCRImage(string filePath, TaskSettings taskSettings = null) { if (File.Exists(filePath)) { using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { - OCRImage(fs, Path.GetFileName(filePath), filePath); + OCRImage(fs, Path.GetFileName(filePath), taskSettings, filePath); } } } - public static void OCRImage(Stream stream, string fileName, string filePath = null) + public static void OCRImage(Stream stream, string fileName, TaskSettings taskSettings = null, string filePath = null) { if (stream != null) { - using (OCRSpaceForm form = new OCRSpaceForm(stream, fileName)) + if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings(); + + OCROptions ocrOptions = taskSettings.CaptureSettings.OCROptions; + using (OCRSpaceForm form = new OCRSpaceForm(stream, fileName, ocrOptions)) { - form.Language = Program.Settings.OCRLanguage; - form.ShowDialog(); - Program.Settings.OCRLanguage = form.Language; + if (ocrOptions.Silent) + { + Program.MainForm.niTray.ShowBalloonTip(3000, "ShareX", Resources.OCRForm_AutoProcessing, ToolTipIcon.Info); + Task.Run(() => form.StartOCR(stream, fileName)).Wait(); + + if (!string.IsNullOrEmpty(form.Result)) { + ClipboardHelpers.CopyText(form.Result); + Program.MainForm.niTray.ShowBalloonTip(3000, "ShareX", Resources.OCRForm_AutoComplete, ToolTipIcon.Info); + } + else + { + Program.MainForm.niTray.ShowBalloonTip(3000, "ShareX", Resources.OCRForm_AutoCompleteFail, ToolTipIcon.Warning); + } + } + else + { + form.ShowDialog(); + } if (!string.IsNullOrEmpty(form.Result) && !string.IsNullOrEmpty(filePath)) { diff --git a/ShareX/TaskSettings.cs b/ShareX/TaskSettings.cs index 323f6efe5..b0be9914e 100644 --- a/ShareX/TaskSettings.cs +++ b/ShareX/TaskSettings.cs @@ -30,6 +30,7 @@ You should have received a copy of the GNU General Public License using ShareX.MediaLib; using ShareX.ScreenCaptureLib; using ShareX.UploadersLib; +using ShareX.UploadersLib.OtherServices; using System; using System.Collections.Generic; using System.ComponentModel; @@ -358,6 +359,12 @@ public class TaskSettingsCapture public ScrollingCaptureOptions ScrollingCaptureOptions = new ScrollingCaptureOptions(); #endregion Capture / Scrolling capture + + #region Capture / OCR + + public OCROptions OCROptions = new OCROptions(); + + #endregion } public class TaskSettingsUpload diff --git a/ShareX/UploadInfoManager.cs b/ShareX/UploadInfoManager.cs index c79a399c9..4046ae725 100644 --- a/ShareX/UploadInfoManager.cs +++ b/ShareX/UploadInfoManager.cs @@ -364,7 +364,7 @@ public void ShowQRCode() public void OCRImage() { - if (IsItemSelected && SelectedItem.IsImageFile) TaskHelpers.OCRImage(SelectedItem.Info.FilePath); + if (IsItemSelected && SelectedItem.IsImageFile) TaskHelpers.OCRImage(SelectedItem.Info.FilePath, Program.DefaultTaskSettings); } public void CombineImages() diff --git a/ShareX/WorkerTask.cs b/ShareX/WorkerTask.cs index 4ff607b6d..d5b879f7d 100644 --- a/ShareX/WorkerTask.cs +++ b/ShareX/WorkerTask.cs @@ -1009,7 +1009,7 @@ private void DoOCR() { if (Data != null && Info.DataType == EDataType.Image) { - TaskHelpers.OCRImage(Data, Info.FileName, Info.FilePath); + TaskHelpers.OCRImage(Data, Info.FileName, Info.TaskSettings, Info.FilePath); } }