수정
This commit is contained in:
22
ScanToTextProgram/MainForm.Designer.cs
generated
22
ScanToTextProgram/MainForm.Designer.cs
generated
@@ -31,6 +31,7 @@
|
|||||||
this.simpleButton_SetScanPoin = new DevExpress.XtraEditors.SimpleButton();
|
this.simpleButton_SetScanPoin = new DevExpress.XtraEditors.SimpleButton();
|
||||||
this.treeList1 = new DevExpress.XtraTreeList.TreeList();
|
this.treeList1 = new DevExpress.XtraTreeList.TreeList();
|
||||||
this.simpleButton_ScanToOcr = new DevExpress.XtraEditors.SimpleButton();
|
this.simpleButton_ScanToOcr = new DevExpress.XtraEditors.SimpleButton();
|
||||||
|
this.simpleButton_KeyHookStart = new DevExpress.XtraEditors.SimpleButton();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.treeList1)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.treeList1)).BeginInit();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
@@ -47,6 +48,14 @@
|
|||||||
//
|
//
|
||||||
this.treeList1.Location = new System.Drawing.Point(140, 12);
|
this.treeList1.Location = new System.Drawing.Point(140, 12);
|
||||||
this.treeList1.Name = "treeList1";
|
this.treeList1.Name = "treeList1";
|
||||||
|
this.treeList1.OptionsBehavior.ReadOnly = true;
|
||||||
|
this.treeList1.OptionsClipboard.AllowCopy = DevExpress.Utils.DefaultBoolean.True;
|
||||||
|
this.treeList1.OptionsClipboard.AllowExcelFormat = DevExpress.Utils.DefaultBoolean.True;
|
||||||
|
this.treeList1.OptionsClipboard.CopyColumnHeaders = DevExpress.Utils.DefaultBoolean.False;
|
||||||
|
this.treeList1.OptionsScrollAnnotations.ShowSelectedRows = DevExpress.Utils.DefaultBoolean.True;
|
||||||
|
this.treeList1.OptionsView.ShowColumns = false;
|
||||||
|
this.treeList1.OptionsView.ShowIndicator = false;
|
||||||
|
this.treeList1.OptionsView.ShowRoot = false;
|
||||||
this.treeList1.Size = new System.Drawing.Size(577, 375);
|
this.treeList1.Size = new System.Drawing.Size(577, 375);
|
||||||
this.treeList1.TabIndex = 1;
|
this.treeList1.TabIndex = 1;
|
||||||
//
|
//
|
||||||
@@ -59,16 +68,28 @@
|
|||||||
this.simpleButton_ScanToOcr.Text = "스캔영역설정";
|
this.simpleButton_ScanToOcr.Text = "스캔영역설정";
|
||||||
this.simpleButton_ScanToOcr.Click += new System.EventHandler(this.simpleButton_SetScanPoin_Click);
|
this.simpleButton_ScanToOcr.Click += new System.EventHandler(this.simpleButton_SetScanPoin_Click);
|
||||||
//
|
//
|
||||||
|
// simpleButton_KeyHookStart
|
||||||
|
//
|
||||||
|
this.simpleButton_KeyHookStart.Location = new System.Drawing.Point(12, 163);
|
||||||
|
this.simpleButton_KeyHookStart.Name = "simpleButton_KeyHookStart";
|
||||||
|
this.simpleButton_KeyHookStart.Size = new System.Drawing.Size(104, 85);
|
||||||
|
this.simpleButton_KeyHookStart.TabIndex = 2;
|
||||||
|
this.simpleButton_KeyHookStart.Text = "Key Hook Start";
|
||||||
|
this.simpleButton_KeyHookStart.Click += new System.EventHandler(this.simpleButton_KeyHookStart_Click);
|
||||||
|
//
|
||||||
// MainForm
|
// MainForm
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(729, 399);
|
this.ClientSize = new System.Drawing.Size(729, 399);
|
||||||
|
this.Controls.Add(this.simpleButton_KeyHookStart);
|
||||||
this.Controls.Add(this.treeList1);
|
this.Controls.Add(this.treeList1);
|
||||||
this.Controls.Add(this.simpleButton_ScanToOcr);
|
this.Controls.Add(this.simpleButton_ScanToOcr);
|
||||||
this.Controls.Add(this.simpleButton_SetScanPoin);
|
this.Controls.Add(this.simpleButton_SetScanPoin);
|
||||||
this.Name = "MainForm";
|
this.Name = "MainForm";
|
||||||
this.Text = "Scan To Text";
|
this.Text = "Scan To Text";
|
||||||
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
|
||||||
|
this.Load += new System.EventHandler(this.MainForm_Load);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.treeList1)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.treeList1)).EndInit();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
@@ -79,6 +100,7 @@
|
|||||||
private DevExpress.XtraEditors.SimpleButton simpleButton_SetScanPoin;
|
private DevExpress.XtraEditors.SimpleButton simpleButton_SetScanPoin;
|
||||||
private DevExpress.XtraTreeList.TreeList treeList1;
|
private DevExpress.XtraTreeList.TreeList treeList1;
|
||||||
private DevExpress.XtraEditors.SimpleButton simpleButton_ScanToOcr;
|
private DevExpress.XtraEditors.SimpleButton simpleButton_ScanToOcr;
|
||||||
|
private DevExpress.XtraEditors.SimpleButton simpleButton_KeyHookStart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +1,44 @@
|
|||||||
using DevExpress.Utils.Extensions;
|
using DevExpress.Utils.Extensions;
|
||||||
|
using DevExpress.XtraPrinting.Native;
|
||||||
|
using DevExpress.XtraWaitForm;
|
||||||
using ScanToTextProgram.OCR;
|
using ScanToTextProgram.OCR;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Reflection.Emit;
|
||||||
using System.Threading.Tasks;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace ScanToTextProgram
|
namespace ScanToTextProgram
|
||||||
{
|
{
|
||||||
public partial class MainForm : Form
|
public partial class MainForm : Form
|
||||||
{
|
{
|
||||||
|
DataTable dataTable = null;
|
||||||
|
|
||||||
|
Rectangle rectangle = new Rectangle();
|
||||||
|
|
||||||
|
OcrProcessor ocrProcessor = new OcrProcessor();
|
||||||
|
|
||||||
public MainForm()
|
public MainForm()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle rectangle = new Rectangle();
|
dataTable = new DataTable();
|
||||||
|
dataTable.Columns.Add("시가");
|
||||||
|
dataTable.Columns.Add("고가");
|
||||||
|
dataTable.Columns.Add("저가");
|
||||||
|
dataTable.Columns.Add("종가");
|
||||||
|
dataTable.Columns.Add("구름(상)");
|
||||||
|
dataTable.Columns.Add("구름(하)");
|
||||||
|
dataTable.Columns.Add("40_1(상)");
|
||||||
|
dataTable.Columns.Add("40_1(하)");
|
||||||
|
dataTable.Columns.Add("40_2(상)");
|
||||||
|
dataTable.Columns.Add("40_2(하)");
|
||||||
|
|
||||||
|
treeList1.DataSource = dataTable;
|
||||||
|
}
|
||||||
|
|
||||||
// 스캔 영역 설정
|
// 스캔 영역 설정
|
||||||
private void simpleButton_SetScanPoin_Click(object sender, EventArgs e)
|
private void simpleButton_SetScanPoin_Click(object sender, EventArgs e)
|
||||||
@@ -28,18 +47,22 @@ namespace ScanToTextProgram
|
|||||||
rectangle = screenCapture.SelectArea();
|
rectangle = screenCapture.SelectArea();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 스캔 버튼 클릭
|
||||||
private void simpleButton_SetScanPoin_Click_1(object sender, EventArgs e)
|
private void simpleButton_SetScanPoin_Click_1(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
scanToOcr();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 설정된 영역에 따라 스캔하고 OCR 변경하기
|
||||||
|
public void scanToOcr()
|
||||||
{
|
{
|
||||||
var screenCapture = new ScreenCapture();
|
var screenCapture = new ScreenCapture();
|
||||||
var selectedArea = rectangle;
|
var selectedArea = rectangle;
|
||||||
var screenshot = screenCapture.CaptureScreen(selectedArea);
|
var screenshot = screenCapture.CaptureScreen(selectedArea);
|
||||||
|
|
||||||
var ocrProcessor = new OcrProcessor();
|
|
||||||
string extractedText = ocrProcessor.ExtractTextFromImage(screenshot);
|
string extractedText = ocrProcessor.ExtractTextFromImage(screenshot);
|
||||||
|
|
||||||
MessageBox.Show(extractedText);
|
var splitLine = extractedText.Split('\n').ToList();
|
||||||
|
|
||||||
var splitLine = extractedText.Split('\n');
|
|
||||||
|
|
||||||
var 시가 = 0.0;
|
var 시가 = 0.0;
|
||||||
var 고가 = 0.0;
|
var 고가 = 0.0;
|
||||||
@@ -52,31 +75,56 @@ namespace ScanToTextProgram
|
|||||||
var _40_2_상 = 0.0;
|
var _40_2_상 = 0.0;
|
||||||
var _40_2_하 = 0.0;
|
var _40_2_하 = 0.0;
|
||||||
|
|
||||||
for (var i=0; i < splitLine.Length; i++)
|
for (var i = 0; i < splitLine.Count(); i++)
|
||||||
{
|
{
|
||||||
if(string.IsNullOrEmpty(splitLine[i])) continue;
|
var str1 = splitLine[i].Trim();
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(str1)) splitLine.Remove(splitLine[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < splitLine.Count(); i++)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(splitLine[i])) continue;
|
||||||
|
|
||||||
var line = splitLine[i];
|
var line = splitLine[i];
|
||||||
|
|
||||||
var test = "BTCUSDT - 1h 097,743.2 H97,824.3 L97,353.0 C97,669.6 -73.6 (~0.08%)";
|
|
||||||
|
|
||||||
// 시가, 고가, 저가, 종가
|
// 시가, 고가, 저가, 종가
|
||||||
if(i==0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
var 시고저종s = line.Split(' ');
|
var 시고저종s = line.Split(' ');
|
||||||
시가 = Convert.ToDouble(시고저종s[4].Remove(0, 1));
|
|
||||||
고가 = Convert.ToDouble(시고저종s[5].Remove(0, 1));
|
var cnt = 시고저종s.Count() - 1;
|
||||||
저가 = Convert.ToDouble(시고저종s[6].Remove(0, 1));
|
|
||||||
종가 = Convert.ToDouble(시고저종s[7].Remove(0, 1));
|
var str_시가 = 시고저종s[cnt - 5].Remove(0, 1);
|
||||||
|
var str_고가 = 시고저종s[cnt - 4];
|
||||||
|
var str_저가 = 시고저종s[cnt - 3].Remove(0, 1);
|
||||||
|
var str_종가 = 시고저종s[cnt - 2];
|
||||||
|
|
||||||
|
if (!str_시가.Contains('.')) str_시가 = str_시가.Insert(str_시가.Length - 1, ".");
|
||||||
|
if (!str_고가.Contains('.')) str_고가 = str_고가.Insert(str_고가.Length - 1, ".");
|
||||||
|
if (!str_저가.Contains('.')) str_저가 = str_저가.Insert(str_저가.Length - 1, ".");
|
||||||
|
if (!str_종가.Contains('.')) str_종가 = str_종가.Insert(str_종가.Length - 1, ".");
|
||||||
|
|
||||||
|
시가 = Convert.ToDouble(str_시가);
|
||||||
|
고가 = Convert.ToDouble(str_고가);
|
||||||
|
저가 = Convert.ToDouble(str_저가);
|
||||||
|
종가 = Convert.ToDouble(str_종가);
|
||||||
}
|
}
|
||||||
// 구름떼
|
// 구름떼
|
||||||
else if(i == 1)
|
else if (i == 1)
|
||||||
{
|
{
|
||||||
var 구름떼s = line.Split(' ');
|
var 구름떼s = line.Split(' ');
|
||||||
var data1 = Convert.ToDouble(구름떼s[3]);
|
|
||||||
var data2 = Convert.ToDouble(구름떼s[4]);
|
|
||||||
|
|
||||||
if(data1 > data2)
|
var str_data1 = 구름떼s[구름떼s.Count() - 1];
|
||||||
|
var str_data2 = 구름떼s[구름떼s.Count() - 2];
|
||||||
|
|
||||||
|
if (!str_data1.Contains('.')) str_data1 = str_data1.Insert(str_data1.Length - 1, ".");
|
||||||
|
if (!str_data2.Contains('.')) str_data2 = str_data2.Insert(str_data2.Length - 1, ".");
|
||||||
|
|
||||||
|
var data1 = Convert.ToDouble(str_data1);
|
||||||
|
var data2 = Convert.ToDouble(str_data2);
|
||||||
|
|
||||||
|
if (data1 > data2)
|
||||||
{
|
{
|
||||||
구름_상 = data1;
|
구름_상 = data1;
|
||||||
구름_하 = data2;
|
구름_하 = data2;
|
||||||
@@ -87,22 +135,76 @@ namespace ScanToTextProgram
|
|||||||
구름_하 = data1;
|
구름_하 = data1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//else if(i == )
|
else if (i == 2)
|
||||||
|
{
|
||||||
|
var 볼린저_40_2s = line.Split(' ');
|
||||||
|
|
||||||
|
var str_40_2_상 = 볼린저_40_2s[볼린저_40_2s.Count() - 2];
|
||||||
|
var str_40_2_하 = 볼린저_40_2s[볼린저_40_2s.Count() - 1];
|
||||||
|
|
||||||
|
if (!str_40_2_상.Contains('.')) str_40_2_상 =str_40_2_상.Insert(str_40_2_상.Length - 1, ".");
|
||||||
|
if (!str_40_2_하.Contains('.')) str_40_2_하 = str_40_2_하.Insert(str_40_2_하.Length - 1, ".");
|
||||||
|
|
||||||
|
_40_2_상 = Convert.ToDouble(str_40_2_상);
|
||||||
|
_40_2_하 = Convert.ToDouble(str_40_2_하);
|
||||||
|
}
|
||||||
|
else if (i == 3)
|
||||||
|
{
|
||||||
|
var 볼린저_40_1s = line.Split(' ');
|
||||||
|
|
||||||
|
var str_40_1_상 = 볼린저_40_1s[볼린저_40_1s.Count() - 2];
|
||||||
|
var str_40_1_하 = 볼린저_40_1s[볼린저_40_1s.Count() - 1];
|
||||||
|
|
||||||
|
if (!str_40_1_상.Contains('.')) str_40_1_상 = str_40_1_상.Insert(str_40_1_상.Length - 1, ".");
|
||||||
|
if (!str_40_1_하.Contains('.')) str_40_1_하 = str_40_1_하.Insert(str_40_1_하.Length - 1, ".");
|
||||||
|
|
||||||
|
_40_1_상 = Convert.ToDouble(str_40_1_상);
|
||||||
|
_40_1_하 = Convert.ToDouble(str_40_1_하);
|
||||||
|
}
|
||||||
|
else if (i == 4)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (i == 5)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (i == 6)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
dataTable.Rows.Clear();
|
||||||
|
var row = dataTable.Rows.Add();
|
||||||
|
row["시가"] = Convert.ToDouble(시가);
|
||||||
|
row["고가"] = Convert.ToDouble(고가);
|
||||||
|
row["저가"] = Convert.ToDouble(저가);
|
||||||
|
row["종가"] = Convert.ToDouble(종가);
|
||||||
|
row["구름(상)"] = Convert.ToDouble(구름_상);
|
||||||
|
row["구름(하)"] = Convert.ToDouble(구름_하);
|
||||||
|
row["40_1(상)"] = Convert.ToDouble(_40_1_상);
|
||||||
|
row["40_1(하)"] = Convert.ToDouble(_40_1_하);
|
||||||
|
row["40_2(상)"] = Convert.ToDouble(_40_2_상);
|
||||||
|
row["40_2(하)"] = Convert.ToDouble(_40_2_하);
|
||||||
|
|
||||||
|
treeList1.DataSource = dataTable;
|
||||||
|
treeList1.RefreshDataSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||||
|
{
|
||||||
|
HookHandler.Unhook();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainForm_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DataTable dataTable = new DataTable();
|
private void simpleButton_KeyHookStart_Click(object sender, EventArgs e)
|
||||||
dataTable.Columns.Add("시가");
|
{
|
||||||
dataTable.Columns.Add("고가");
|
HookHandler.SetHook(this);
|
||||||
dataTable.Columns.Add("저가");
|
|
||||||
dataTable.Columns.Add("종가");
|
|
||||||
dataTable.Columns.Add("구름(상)");
|
|
||||||
dataTable.Columns.Add("구름(하)");
|
|
||||||
dataTable.Columns.Add("40_1(상)");
|
|
||||||
dataTable.Columns.Add("40_1(하)");
|
|
||||||
dataTable.Columns.Add("40_2(상)");
|
|
||||||
dataTable.Columns.Add("40_2(하)");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,23 +8,29 @@ using Tesseract;
|
|||||||
|
|
||||||
namespace ScanToTextProgram.OCR
|
namespace ScanToTextProgram.OCR
|
||||||
{
|
{
|
||||||
internal class OcrProcessor
|
public class OcrProcessor
|
||||||
{
|
{
|
||||||
public string ExtractTextFromImage(Bitmap image)
|
public string ocrPath = "D:\\tessdata-4.1.0";
|
||||||
|
|
||||||
|
TesseractEngine tesseractEngine;
|
||||||
|
|
||||||
|
public OcrProcessor()
|
||||||
{
|
{
|
||||||
// Tesseract OCR 초기화
|
// Tesseract OCR 초기화
|
||||||
|
tesseractEngine = new TesseractEngine(ocrPath, "eng", EngineMode.Default);
|
||||||
|
}
|
||||||
|
|
||||||
string ocrPath = "D:\\Download\\tessdata-4.1.0";
|
public string ExtractTextFromImage(Bitmap image)
|
||||||
|
|
||||||
using (var engine = new TesseractEngine(ocrPath, "eng", EngineMode.Default))
|
|
||||||
{
|
{
|
||||||
// 이미지를 텍스트로 변환
|
// 이미지를 텍스트로 변환
|
||||||
using (var pix = PixConverter.ToPix(image))
|
var pix = PixConverter.ToPix(image);
|
||||||
{
|
tesseractEngine = new TesseractEngine(ocrPath, "eng", EngineMode.Default);
|
||||||
var result = engine.Process(pix);
|
// 숫자와 점(.)만 인식하도록 설정
|
||||||
|
tesseractEngine.SetVariable("tessedit_char_whitelist", "0123456789., \n");
|
||||||
|
|
||||||
|
var result = tesseractEngine.Process(pix);
|
||||||
return result.GetText();
|
return result.GetText();
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="HookHandler.cs" />
|
||||||
<Compile Include="ScreenCapture.cs" />
|
<Compile Include="ScreenCapture.cs" />
|
||||||
<Compile Include="MainForm.cs">
|
<Compile Include="MainForm.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
|
|||||||
Reference in New Issue
Block a user