52pj专发,Python 截图转文字的小工具(有源码)

以前是用QQ破图,但是QQ需要把图片发送出去,再打开图片长按才能识别成文字。

一直想弄个小工具,截图后来剪贴板就自动变成文字,方便粘贴 。所以就折腾了这个。

由于我的服务器上已经部署了TesseractOCR,所以识图部分就通过 requests.post 交给服务器去完成的。

TesseractOCR服务器部署简要说明(涉及的文件软件,在下载地址中都有)

1 安装 tesseractOCR (EXE)软件,并配置环境变量。

2 安装 apache 服务器(我用的是xmapp)。

3 把压缩包中的 TesseractOCR (PHP)放到 apache 服务器生成的htdocs 文件夹中去,然后就可以使用 http://www.xxxxx.com /TesseractOCR 这个API了,好外是没有限制,准确度也行,而且方便自己所有相关的应用访问。

*:python本身也可以直接使用TesseractOCR

打开软件后按住鼠标选定要识别的区域,松开鼠标就可以去粘贴识别出来的内容了。

右键可以中止操作。

老规则,上源码:

下载地址: 链接:https://pan.baidu.com/s/1e8N-GbYuYMnWwNZrO6xGPw?pwd=4fds 提取码:4fds

52pj专发,Python 截图转文字的小工具(有源码)

52pj专发,Python 截图转文字的小工具(有源码)

52pj专发,Python 截图转文字的小工具(有源码)

打包后文件有点大呢python不提议打包

from PIL import ImageGrab
import tkinter
import requests
import base64
from io import BytesIO
import json
import pyperclip
import math
import os


class PScreenWindow:
    def __init__(self):
        self._sx, self._sy = 0, 0

        self._win = tkinter.Tk()
        self._win.attributes("-alpha", 0.6)  # 设置窗口半透明
        self._win.attributes("-fullscreen", True)  # 设置全屏
        self._win.attributes("-topmost", True)  # 设置窗口在最上层
        self._width, self._height = self._win.winfo_screenwidth(
        ), self._win.winfo_screenheight()
        self._screenImage = ImageGrab.grab()
        self._screenImage.save("temp.png", format='PNG')
        self._tempImage = tkinter.PhotoImage(file="temp.png")
        # 创建画布
        self._canvas = tkinter.Canvas(
            self._win, width=self._width, height=self._height, highlightthickness=0, borderwidth=0)

        self._canvas.create_image(
            self._width*0.5, self._height*0.5, image=self._tempImage)
        self._canvas.create_rectangle(
            0, 0, self._width, self._height, fill='black', outline='', tag="bg")
        self._canvas.pack(fill="both")
        self._win.bind('<Button-1>', self.mouseEvent)  # 绑定鼠标左键点击事件
        self._win.bind('<Button-3>', self.mouseEvent)  # 绑定鼠标右键点击事件
        self._win.bind('<ButtonRelease-1>', self.mouseEvent)  # 绑定鼠标左键点击释放事件
        self._win.bind('<B1-Motion>', self.mouseMove)  # 绑定鼠标左键点击移动事件
        # 绑定Esc按键退出事件
        self._win.bind('<Escape>', lambda e: self.exit())
        self._win.mainloop()  # 窗口持久化

    def exit(self):
        try:
            os.remove('temp.png')
        except:
            pass
        self._win.destroy()
        print("操作完成")

    def getDistance(self, x1, y1,  x2, y2):
        return math.sqrt((x1-x2)**2+(y1-y2)**2)

    def sortPoint(self, x1, y1, x2, y2):
        return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)]

    def mouseEvent(self, event):
        print(event.state, event.num)
        if (event.num == 3):
            self.exit()
            return
        if event.state == 8:  # 鼠标左键按下
            self._sx, self._sy = event.x, event.y
            self._canvas.delete("bg")
        elif event.state == 264:  # 鼠标弹起
            d = self.getDistance(self._sx, self._sy, event.x, event.y)
            if d < 20:
                return
            x1, y1, x2, y2 = self.sortPoint(
                self._sx, self._sy, event.x, event.y)
            self._canvas.create_text(
                (x1+x2)*0.5, (y1+y2)*0.5, text="识别中...", font=("微软雅黑", 16), fill='red')

            img = self._screenImage.crop(
                (x1, y1, x2, y2))
            outBuffer = BytesIO()
            img.save(outBuffer, format='PNG')
            byteData = outBuffer.getvalue()
            imgBase64 = base64.b64encode(byteData).decode('ascii')

            # print(imgBase64)
            url = "http://www.xxxxxxxx.cn/TesseractOCR/"
            data = {"type": "ocr", "img": imgBase64}
            headers = {'Content-Type': 'application/x-www-form-urlencoded'}

            res = requests.post(url=url, data=data, headers=headers)
            content = res.text
            # print("识别结果:", content)
            if content.startswith(u'ufeff'):
                content = content.encode('utf8')[3:].decode('utf8')
            try:
                data = json.loads(content)
                if (data.get("code") == "1"):
                    pyperclip.copy(data.get("text"))
                else:
                    pyperclip.copy("ocr fail")
            except Exception as e:
                pyperclip.copy(str(e))
            self.exit()

    def mouseMove(self, event):
        d = self.getDistance(self._sx, self._sy, event.x, event.y)
        if d < 20:
            return
        x1, y1, x2, y2 = self.sortPoint(self._sx, self._sy, event.x, event.y)
        rectPoints = {"left": [0, 0, x1, self._height], "top": [x1, 0, x2,  y1], "right": [
            x2, 0, self._width,  self._height], "bottom": [x1, y2, x2,  self._height]}
        for key in rectPoints:
            self._canvas.delete(key)
            ltx, lty, rbx, rby = rectPoints[key]
            self._canvas.create_rectangle(
                ltx, lty, rbx, rby,  fill='black', outline='', tag=key)
        self._canvas.delete("border")
        self._canvas.create_rectangle(
            x1, y1, x2, y2,  fill='', outline='red', tag="border")


if __name__ == '__main__':
    psw = PScreenWindow()

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共48条

请登录后发表评论

    暂无评论内容