前幾年寫的,Ocr 截圖識別付費軟件頻出時實現自用
實現方案
1、調用任何截圖軟件截圖,自動保存到剪切板
2、python 調用剪切板,獲取圖片流保存為固定位置的臨時本地圖片
3、識別本地圖片,文本內容重新復制到剪切板
import ioimport osimport base64import PILimport jsonpathimport pyperclipfrom aip import AipOcrfrom PIL import Image, ImageGrabroot_path = os.path.abspath(".")_app_id = 'xxx' # 從百度,阿裡,騰訊等等 都行,申請orc服務賬戶,每日有免費識別量,足夠個人使用_api_key = 'xxx'_secrect_key = 'xxx'# 百度雲api對象client = AipOcr(_app_id, _api_key, _secrect_key)# ocr 識別的最大圖片大小不能超過 4 兆img_max_size = 4096def get_file_content(file_path: str): """ 讀取文件 """ with open(file_path, 'rb') as fp: return fp.read()def get_size_kb(file_path: str): """ 獲取文件大小(kb) """ size = os.stat(file_path).st_size return round(size / 1024)def ocr_img(img: bytes, wrap: bool = True): """ 識別圖片中的文字內容 :param img: 圖片base64 :param wrap: 是否換行,默認換行 :return: """ data = client.basicGeneral(img) t = jsonpath.jsonpath(data, '$.words_result[*].words') if t and wrap: return '\n'.join(t) return ' '.join(t)def get_image_from_clipboard(): """ 保存剪切板圖片到本地 """ img = ImageGrab.grabclipboard() if isinstance(img, Image.Image): img.save('test.png', 'png') print("保存剪切板圖片") else: print("剪切板無圖片")def get_image_base64_from_clipboard(): """ 保存剪切板圖片為IO流 """ img_buffer = io.BytesIO() img = ImageGrab.grabclipboard() if isinstance(img, Image.Image): img.save(img_buffer, 'png') # b64 = base64.b64encode(img_buffer.getvalue()) b64 = base64.encodebytes(img_buffer.getvalue()) print(b64) print("保存剪切板圖片為Base64編碼") else: print("剪切板內無圖片")def set_clipboard_text(msg: str): """ 寫入剪切板內容 """ pyperclip.copy(msg)def get_clipboard_text(): """ 讀取剪切板內容 """ return pyperclip.paste()
# -*- coding: utf-8 -*-from ApiOcr import *def ocr_clipboard(): """ 用於獲取剪切板圖片信息,並保存到本地,然後進行 """ # 獲取剪切板中的圖片 img = ImageGrab.grabclipboard() if img is None: print('剪切板中無圖片') return if isinstance(img, Image.Image): # 保存圖片 file_path = root_path + '/test.png' img.save(file_path) # 獲取文件大小 size = get_size_kb(file_path) if size > img_max_size: print('圖片不能超過 {} kb,當前 {} kb:'.format(img_max_size, size)) # 讀取圖片 image = get_file_content(file_path) # 識別圖片內容 text = ocr_img(image, True) # text = ocr_img(image, False) print(text) # 寫入剪切板 set_clipboard_text(text)if __name__ == '__main__': ocr_clipboard()