前言

现在网上查资料的时候,有很多自己想复制下来的文章,但是却有限制,它会引导你去充值消费它们的VIP,从而得到权限复制。当然要想不充值就复制,办法不是没有,而我最常用的就是打开QQ软件,把想要复制的文章进行截图,然后提取图中文字。

QQ提取文字功能


       当然每次见到有意思的功能,自己都会去研究研究是怎么实现的。今天刚好就有时间,顺便复习一下Winform。刚做的时候我有在网上查相关资料。大部分都是介绍两种方式:

方式一、Asprise-OCR实现。

方式二、Microsoft Office Document Imaging(Office 2007) 组件实现。

我也有试了一试这两种方式。但是 (方式一)对中文不支持,而(方式二)却需要用户下载 组件 从而实现。当然如果开发一款 APP且需要用户下载其他插件才可以使用的话,那可大大降低了用户体验感了。所以只好抛弃这两种方式,采用百度AI的OCR图文识别接口。

实现思路

【1】建立两个窗体,分别为主窗体和截图窗体。
【2】主窗体拥有 PictureBox 控件用于装载,截出来的图,或者预览本地图 片。
【3】也就是说,实现图文识别目标,分2种;1是从本地找出带文字的图片。2是截图。
【4】点击截图按钮的时候,立即调用截图窗体,而当前窗体Hide()隐藏掉。截图窗体本身为一个半透明的窗体。而截图的过程中最重要的是分为3步骤;
(1)鼠标按下时 : MouseDown 代表截图的开始,记录好鼠标按下时的坐标。
(2)鼠标移动时 : MouseMove 鼠标移动的同时,记录偏移坐标,同时 使用 Graphics 的 FillRectangle() 方法,根据鼠标移动的坐标填充一个矩形,且这个范围清除背景实现完全透明。代表截图的区域。
(3)鼠标释放时:MouseUp 记录当前坐标,关闭截图窗体,调用主窗体内生成截图的 Graphics 工具CopyFromScreen() 方法。并显示主窗体。代表截图结束。
【5】那么在生成截图完毕之后,给PictureBox的BackgroundImage设置背景图片。
【6】在PictureBox 中添加 contextMenuStrip控件,可以鼠标右键,复制图片。使用的是 Clipboard.SetImage()方法。复制到剪贴板。这样就可以任意将截好的图复制在任何可以粘帖的地方。
【7】点击识别文字按钮。首先你得需要去百度AI开放平台去申请图文识别应用获得相关 API_KEY 和 SECRET_KEY 。经过 client.GeneralBasic(); 读取图片路径二进制文件。也就是 用 IO文件的 ReadAllBytes()方法就好了 File.ReadAllBytes(imagePath);。最后百度OCR图文识别会返回相关JSON格式数据回来。要想赋值在 TextBox 中还需要进行解析。那在返回格式中有 “words_result_num”:字段那就好说了,代表结果数据的行数。之后进行循环就好了。那么就不多说了,直接上代码。

数据返回格式

{"log_id": xxxxxxxxxxxxxxxxxxxxx,"words_result_num": 11,"words_result": [{"words": "“OCR是英文 Optical Character Recognition的缩写,意思是光学字符识别"},{"words": "也可简单地称为文字识别,是文字自动输入的种方法。它通过扫描和摄像等"},{"words": "光学输入方式获取纸张上的文字图像信息,利用各种模式识别算法分析文字形"},{"words": "态特征可以将票据、报刊、书籍、文稿及其它印刷品转化为图像信息,再利用文"},{"words": "字识别技术将图像信息转化为可以使用的计算机翰入技术。可应用于银行票据、"},{"words": "大量文字资料、档案卷宗、文案的录入和处理领域。适合于银行、税务等行业大"},{"words": "量票据表格的自动扫描识别及长期存储。相对-般文本,通常以最终识别率、识"},{"words": "别速度、版面理解正确率及版面还原满意度4个方面作为OCR技术的评测依据」"},{"words": "而相对于表格及票据,通常以识别率或整张通过率及识别速度为测定OCR技术"},{"words": "的实用标准,随着人工智能的兴起,人们在追求让工作更简单化,OC识别技"},{"words": "术"}]
}

实现步骤

1:主窗体界面

主界面代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Drawing.Imaging;
using System.Threading;namespace ImageRecognition
{public partial class Mainform : Form{/// <summary>/// 声明当前窗体,用于截图完了之后调用/// </summary>public static Mainform currentForm = null;public string imagePath = "";public Mainform(){InitializeComponent();currentForm = this;}/// <summary>/// 点击浏览图片按钮事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_imgpath_Click(object sender, EventArgs e){openFileDialog1.ShowDialog();txt_imgpath.Text = openFileDialog1.FileName;pictureBox.BackgroundImage = Image.FromFile(txt_imgpath.Text);pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;}/// <summary>/// 加载事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){}/// <summary>/// 生成截图,截图完成并鼠标释放时调用/// </summary>/// <param name="x"></param>/// <param name="y"></param>/// <param name="width"></param>/// <param name="height"></param>public void GeneratingScreenshots(int x, int y, int width, int height){try{pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;Bitmap image; image = new Bitmap(width, height);Graphics g = Graphics.FromImage(image);//'截屏 CopyFromScreen,前两个参数表示截屏起点,第三和第四为绘制图像的起点。g.CopyFromScreen(x, y, 0, 0, new System.Drawing.Size(width, height));//当图片小于  pictureBox 控件的时候给他居中if (width < pictureBox.Width && height < pictureBox.Height)pictureBox.BackgroundImageLayout = ImageLayout.Center;pictureBox.BackgroundImage = image;}catch (Exception ex){MessageBox.Show(ex.Message);}}/// <summary>/// 右击鼠标 点击复制图片时/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void 复制图片在剪贴板ToolStripMenuItem_Click(object sender, EventArgs e){//判断 pictureBox 是否有图片 即判断是否已经截图if (pictureBox.BackgroundImage != null)      {//将图片已复制到剪贴板Clipboard.SetImage(pictureBox.BackgroundImage);MessageBox.Show("图片已复制到剪贴板", "", MessageBoxButtons.OK, MessageBoxIcon.Information);}}/// <summary>/// 点击截图按钮事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_Screenshot_Click(object sender, EventArgs e){this.Hide();                                  //当前窗体隐藏Screenshot screenshot = new Screenshot();     //实例化截图窗体screenshot.ShowDialog();                      //显示截图窗体}/// <summary>/// 点击图文识别按钮的点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_BaiduOCR_Click(object sender, EventArgs e){//百度图文识别应用的 API_KEY,以及 SECRET_KEY  ,可以登录去复制var API_KEY = "你的API_KEY";var SECRET_KEY = "你的SECRET_KEY";var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY);client.Timeout = 60000;  // 设置超时时间if (imagePath.IndexOf('.') == -1){imagePath = txt_imgpath.Text;}else {MessageBox.Show("您还未截图,或选择图片识别");return;}var image = File.ReadAllBytes(imagePath);try{//发送需要识别的图片var result = client.GeneralBasic(image);txt_result.Text = JsonGetStr(result.ToString());}catch (Exception ex){txt_result.Text = ex.Message;}}/// <summary>/// 解析百度API返回的json格式扫描内容/// </summary>/// <param name="ReText"></param>/// <returns></returns>public string JsonGetStr(string ReText){JObject obj = Newtonsoft.Json.Linq.JObject.Parse(ReText);string resMag = "";JToken record = obj["words_result"];JToken[] TrainInfoArr = record.ToArray();int arrLength = TrainInfoArr.Length;for (int i = 0; i < arrLength; i++){resMag += TrainInfoArr[i]["words"].ToString();}return resMag;}private void 保存截图CtrlsToolStripMenuItem_Click(object sender, EventArgs e){if (pictureBox.BackgroundImage != null){SaveFileDialog saveFile = new SaveFileDialog();saveFile.DefaultExt = "png";saveFile.Filter = "Png Files|*.png";Random ranNum = new Random();saveFile.FileName = "XiaoGang" + ranNum.Next(1000, 9999);imagePath = saveFile.FileName;DialogResult dialogResult = saveFile.ShowDialog();if (dialogResult == System.Windows.Forms.DialogResult.OK){pictureBox.BackgroundImage.Save(saveFile.FileName, ImageFormat.Png);}}}}
}

截图窗体 :不需要拖取控件,只需要设置以下属性即可;

(1) Cursor属性为:Cross;代表鼠标滑过时,为一个十字架形状。
(2) FormorderStyle属性为:None;不需要任何外观形式,不显示最小化、最大化、和关闭按钮。
(3)WindowState属性为:Maximized;窗体为最大化;
(4)Optity属性为:50%;设置窗体透明度于截图完全透明区域形成对比。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace ImageRecognition
{public partial class Screenshot : Form{int x, y, nowX, nowY, width, height;bool isMouthDown = false;Graphics g;/// <summary>/// 鼠标释放/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form2_MouseUp(object sender, MouseEventArgs e){nowX = MousePosition.X + 1;nowY = MousePosition.Y + 1;this.Close();Mainform.currentForm.GeneratingScreenshots(x < nowX ? x : nowX, y < nowY ? y : nowY, width, height);Mainform.currentForm.Show();}/// <summary>/// 鼠标移动的时候/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form2_MouseMove(object sender, MouseEventArgs e){if (isMouthDown){width = Math.Abs(MousePosition.X - x);         //获取宽height = Math.Abs(MousePosition.Y - y);        //获取高g = CreateGraphics();                          //开始创建一个Graphicsg.Clear(this.BackColor);                       //清空背景颜色//根据鼠标移动的坐标填充一个矩形g.FillRectangle(Brushes.CornflowerBlue, x < MousePosition.X ? x : MousePosition.X, y < MousePosition.Y ? y : MousePosition.Y, width + 1, height + 1);}}/// <summary>/// 鼠标按下的时候/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form2_MouseDown(object sender, MouseEventArgs e){x = MousePosition.X;y = MousePosition.Y;isMouthDown = true;}public Screenshot(){InitializeComponent();}}
}

注意:忘记提到了,一定要添加 using Baidu.Aip.Ocr; 百度的图文识别OCR的引用。可在Visual studio中右击项目 管理Nuget程序包中去下载


项目整体运行视频

Winform仿qq截图,OCR图文识别

最后

好了今天的分享到此结束!!欢迎指出不足,诚恳接受批评。当然有问题的小伙伴可以下方评论。如果连OCR百度图文识别的API也懒得去申请,也可以私聊我。借给你们玩玩。

好朋友博客地址https://blog.csdn.net/weixin_43851854

使用C#的Winform实现图文识别OCR及截图功能相关推荐

  1. 宝可梦 图片识别python_初探利用Python进行图文识别(OCR)

    话说什么是OCR????? 简介 OCR技术是光学字符识别的缩写(Optical Character Recognition),是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转 ...

  2. mysql和ocr_图文识别OCR的作用和优势是什么?

    办公中针对文件进行扫描是很常见的操作,但是当我们在进行文件扫描的时候,往往却发现我们所扫描的文件并不是那么清晰,甚至难以辨别出来字体.那么这个时候一些有经验的朋友会提到OCR,图文识别OCR的优势是什 ...

  3. ocr语种识别_利用OCR图文识别,快速帮你提取文字信息

    我们在浏览网页.读书的时候,经常找到我们感兴趣的资料,有时候一些纸质文字或图片是无法复制保存的,那么为了方便这类信息的提取.编辑保存,中安未来特研发了OCR图文识别技术: 中安未来OCR图文识别技术是 ...

  4. python:ocr图文识别(百度智能云API文字识别)

    文章目录 前言 一.创建账号和应用 二.具体步骤 1.第一种方式: 2.第二种方式 总结 前言 说道OCR图文识别,其实python也有在自己的库(以下是我了解,应该还有很多): 第一个 tesser ...

  5. Java调用aliyun OCR图文识别

    1.获取AccessKey ID&Access Key Secret 调用阿里云sdk首先需要创建自己阿里云账号,取得AccessKey 和 Access Key Secret的值,这两个参数 ...

  6. Ocr 图文识别技术——基于百度云OCR技术学习与总结

                                                               Ocr 图文识别技术--基于百度云OCR技术学习与总结 1.百度智能云 控制台   ...

  7. 微信小程序基于OCR插件实现图文识别(超简单)

    前言 前几天写了一个有关于微信小程序图文识别的功能,当时引用的是第三方百度云api实现的,那微信小程序官方有没有自带的方法或者插件能实现这个功能呢?经实践,还真有那么一个合适的插件,相对比第三方的调用 ...

  8. 百度OCR java-SDK做图文识别

    OCR图文识别技术现广泛应用于银行卡身份证等信息读取.办公文档识别(替代扫描).车辆号码识别.印章.二维码识别等场景,成为人们生活的方便助手.只是,这项技术要使用到AI交互,所以还没有独立的SDK供下 ...

  9. java实现OCR图文识别Tess4j,高准确率高效率

    java实现OCR图文识别Tess4j,高准确率高效率,用最新的词库2秒就可以识别,没有最新词库的找我 傻瓜式调用中文词库,及其方便. 虽然不能达到99%的准确率,但是也能达到90%左右的准确率,而且 ...

  10. ABBYY FineReader OCR图文识别软件如何快速将纸质文档转为电子档教程

    先给大家普及下一个小知识:MFP(Multi-Functional Peripheral),即多功能数码复合一体机,集合了打印.复印.扫描.传真等多种功能. 在这个科技高度发达的年代,相信每家公司都有 ...

最新文章

  1. 两个有序数组的中位数(第k大的数)
  2. java中,字符串和集合判断是否为空
  3. Spring Boot-@EnableWebMvc注解
  4. 心理医生给女人的忠告
  5. P3345-[ZJOI2015]幻想乡战略游戏【点分树,RMQ】
  6. django 中静态文件项目加载问题
  7. navicat将远程数据库复制到本地数据库方法
  8. Mixed Content: The page at ‘https://XXX’ was loaded over HTTPS, but requested an insecure...........
  9. PHP trim()的使用
  10. java 浏览器设置字体大小_css 字体设置(不同浏览器设置效果)
  11. php检测是否存在敏感词,用于检测敏感词的 PHP 扩展
  12. 美团旅行前端技术体系的思考与实践
  13. uni-app修改代码,微信开发者工具不更新
  14. FAT文件系统(stm32)
  15. AI内容生成工具列表,可用于生成 AI 内容的工具列表。具有图像生成、文本生成等功能。
  16. cuda实战阅读笔记:共享内存、常量内存、事件时间
  17. 秒杀抢红包的思考和总结
  18. Taro 小程序开发大型实战(六):尝鲜微信小程序云(上篇)
  19. json字符串转json对象(前端json字符串转json对象)
  20. UG/NX二次开发 选择坐标系控件 UF_UI_specify_csys

热门文章

  1. iOS HealthKit
  2. 推荐一款绘画软件krita,开源正版免费,适合ps用户
  3. 基于统计语言模型的拼音输入法
  4. qq四国军旗2.1 beat03 builde017记牌器开发思路(二)
  5. 东芝计算机配置,东芝Toshiba笔记本电脑开机进入BIOS的方法与bios设置参数介绍(ESC+F1)...
  6. zoj1479 dweep soj1106 搜索
  7. 卷积神经网络python实例,python卷积神经网络图像
  8. oracle磁带库清洁带标签,LTO-1/2/3/4/5/6/7/8 Ultrium数据磁带 清洗带 清洁带 磁带标签批发...
  9. 没有项目经验,如何书写漂亮的简历?
  10. AutoRunner不能录制脚本的解决办法