前语

之前看到同事运用了一款叫做天若的Ocr文本辨认小工具,觉得很不错,但是免费版有运用次数,虽可自定义供货商,但归根到底仍是需求自己去购买相应的Ocr服务(修正下,了解到天若Ocr有离线版本的,源码网站我没找到相关资源就不放了),想起自己最初给前店东做Ocr服务时了解过一款开源线程池的七个参数,可本地化的超轻量级中文OCR(可练习) PaddleOCR-Gitee, 然后结合自己的了解的C#语言用Winfor线程撕裂者m线程是什么意思写了款简练版的离线版Ocr文本辨认小工具Demo。尽管没有初始化英文天若那么专业,但是根本也够线程和进程的区别是什么用了,gitlab提供下源码有爱好的小伙伴可自行源码编辑器初始化电脑去优化。

预览展示

Ocr小工具(文本辨认)

Ocr小工具(文本辨认)

要害代码

第一步引进PaddleOCR的.NE线程的几种状态T里的 NutGet工具类库PadGitdleOCRSharp:

运用示例

OpenFileDialog ofd = new OpenFileDialog();
  ofd.Filter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
  if (ofd.ShowDialog() != DialogResult.OK) return;
//运用默许中英文V3模型
  OCRModelConfig config = null;
//运用默许参数
  OCRParameter oCRParameter = new  OCRParameter ();
//辨认效果方针
  OCRResult ocrResult = new OCRResult();
  //主张程序全局初始化一次即可,不用每次辨认都初始化,简略报错。     
  PaddleOCREngine engine = new PaddleOCREngine(config, oCRParameter);
   {
    ocrResult = engine.DetectText(ofd.FileName );
   }
 if (ocrResult != null) MessageBox.Show(ocrResult.Text,"辨认效果"); 

第二步写好截图代码,我这儿线程数是什么开源矿工用了一个新窗体开源是什么意思开源中国存当时屏幕截图,然后进行裁剪,再传递给上述方法进行辨认

public partial class ScreenMain : Form
{ 
    int x, y, nowX, nowY, width, height;
    bool isMouthDown = false;
    bool Ocring = false;
    Graphics g;
    public ScreenMain()
    {
        InitializeComponent();
    }
    private void Form2_MouseDown(object sender, MouseEventArgs e)
    {
        x = MousePosition.X;
        y = MousePosition.Y;
        isMouthDown = true;
    }
    private void Form2_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMouthDown && !Ocring)
        {
            width = Math.Abs(MousePosition.X - x);
            height = Math.Abs(MousePosition.Y - y);
            g = CreateGraphics();
            g.Clear(BackColor);
            g.FillRectangle(Brushes.CornflowerBlue, x < MousePosition.X ? x : MousePosition.X, y < MousePosition.Y ? y : MousePosition.Y, width + 1, height + 1);
        }
    }
    private void Form2_MouseUp(object sender, MouseEventArgs e)
    {
        nowX = MousePosition.X + 1;
        nowY = MousePosition.Y + 1;
        this.Close();
        //formMain.pcurrentWin.sendEndMes += tellEnd;
        // 开启线程处理数据
        Task t = new(() =>
        {
            Ocring = true;
            formMain.pcurrentWin.Snap(x < nowX ? x : nowX, y < nowY ? y : nowY, Math.Abs(nowX - x), Math.Abs(nowY - y));
        }); 
        t.Start();
        formMain.pcurrentWin.Show();
    }
    /// <summary>
    /// 告知load数据完毕的方法
    /// 此方法仍为子线程中的方法,由于被子线程中的托付调用
    /// </summary>
    /// <param name="mes"></param>
    private void tellEnd(string mes)
    {
        Ocring = false;
        // 处理数据完成后的提示信息
        formMain.pcurrentWin.Show(); 
    } 
}

最终就是主程序的一个辨认展示处理源码之家,没啥特别之处

public void Snap(int x, int y, int width, int height)
{ 
    try
    { 
        image = new Bitmap(width, height);
        Graphics g = Graphics.FromImage(image);
        g.CopyFromScreen(x, y, 0, 0, new System.Drawing.Size(width, height));
        var ocrResult = engine.DetectText(image);
        pictureBox2.Image = image;
        if (ocrResult != null)
        {
            textBox1.Text = string.Join("rn",ocrResult.TextBlocks.Select(o=>o.Text));
        }
    }
    catch (Exception e)
    {
        MessageBox.Show("辨认犯错:" + e.Message);
    }
    pictureBox1.Hide();
    //sendEndMes("处理完毕");
}

然后就完成了我们的小工具了

提取码: jmkc
Exe文线程和进程的区别是什么Git: pan.ba线程池的七个参数idu.com/s开源阅读app下载安装/1TcChilVH…
(Win64需求.Net6运giti轮胎行时)
Exe文件: pan.b源码精灵永久兑换码aidu.com/s源码编程器/1UnrgnllP…
(初始化游戏启动器失败自带.Net6运行时,文件比较源码1688多)

码云初始化电脑地址: gitee.com/开源节流是什么意思hmgslj_admi…

相关资料

Pad初始化电脑时出现问题未进行更改dleOCR-Gitee
PaddleShar源码交易平台p
WinForm
WPF