我們都知道,部分電子版的書籍是以掃描圖片的形式展現的,在閱讀過程中無法選取文字。對於平時有記錄習慣的人來說,無法複製黏貼真的很不爽! 為瞭解決這個問題,需要這樣一個指令碼,他有下面這些功能:
1、能夠實現自由
2、能夠識別含有文字的
3、將識別出的文字輸出到剪下板
大致上需要的東西非常明確,那麼,一個一個的來~
作為一項非常實用的功能,自然是有各種各樣的實現,在這裡考慮使用python去完成這個任務,那麼自然是先google一下,網上一搜,果然資料多到爆炸~
不出所料,python對功能做了很好的基礎支援~(本文基於windows平台下的python2實現,python3安裝某些庫真滴煩人)
(1)全屏
那麼先從簡單的做起(稍微麻煩一點,其他部分都超級簡單 = =),首先實現python的“全屏”
代碼入下:
from PIL import ImageGrabim = ImageGrab.grab() # 截取全屏im.save(file)
簡單的三行代碼搞定~(讚美一下前人的偉大_(:з)∠)_)
其中的path表示檔案檔案的完整存放路徑
其中稍微要注意一下的是,安裝庫的時候,使用
pip install pillow(而不是PIL)
否則會顯示找不到匹配的模組~
(PS:這裡其實有個問題,上述代碼運行完成後,並沒有截取全屏,最後產生的圖片僅僅為部分圖片,查看網上攻略後並沒有找到比較好的解決方案,殘念…)
(2)自由
好了,全屏完成,那麼我們其實只想要截取需要的部分就行了,那麼怎麼去完成這個功能呢~
看了一部分網上的做法,最常見的就是監聽滑鼠動作實現選擇地區。其中,其中使用較多的是tkinter,以及pyHook(tkinter實現那個稍微複雜一點),我個人傾向於後者,因為實現起來非常簡單,哈哈~
那麼先上部分代碼
# coding:utf-8import win32apiimport osfrom PIL import ImageGrab, Imageimport pyHookimport pythoncom# 建立一個座標列表(x1,y1,x2,y2)coordinate = [1, 1, 1, 1]# 監聽鍵盤事件def on_mouse_event(event): file_path = 'xx//xx//read.jpg' # 監聽滑鼠事件 if event.MessageName == 'mouse left down': coordinate[0:2] = event.Position elif event.MessageName == 'mouse left up': coordinate[2:4] = event.Position win32api.PostQuitMessage() # 退出監聽迴圈 # 截取座標圖片 pic = ImageGrab.grab(coordinate) pic.save(file_path)
唯一比較麻煩的就是各種庫的安裝,重點點名pywin32這個庫 = =,真姬兒麻煩~
那麼在這裡附上連結,防止安裝過程中可能出現的問題:
解決安裝pywin32後仍然提示找不到模組的問題
文字識別
搞定了功能以後,剩下的工作就比較簡單了。python的pytesseract為文字識別提供了很好的支援。整個實現只需要一行關鍵代碼即可:
from PIL import Imageimport pytesseracttext=pytesseract.image_to_string(Image.open(file_path),lang='chi_sim')print(text)
使用這個庫之前,必須安裝識別引擎tesseract-ocr,下載連結如下(下載完成後為exe安裝包):
tesseract-ocr識別引擎下載
這裡附上安裝及配置環境變數的教程(摘自百度百科):
圖片文字OCR識別-tesseract-ocr4.00.00安裝使用
最後,在pytesseract庫檔案中進行配置,找到F:\XX\XX\XX\你的python安裝路徑\Lib\site-packages\pytesseract
找到該路徑下的pytesseract.py檔案,開啟後找到一下這句代碼:
tesseract_cmd = 'tesseract'
將字串’tesseract’替換成你的tesseract-ocr的安裝路徑(e.g.’F:\Program_File\Tesseract-OCR\tesseract.exe’)
至此,文字識別引擎的全部配置就已經完成了。
訪問剪下板
最後,將識別好的文字匯入剪下板
兩步到位:
(1)pip安裝pyperclip庫
(2)同樣一行代碼:
pyperclip.copy(text) # 將識別內容匯入系統剪下板
大功告成~
總結
整個代碼實現非常的簡潔,總共也就幾十行不到的代碼,這也多虧了python強大的庫支援。
然而比較遺憾的是,功能的實現很是簡陋,使用tkinter可以實現出類似QQ的效果(代碼也相對複雜一些)~
有了這個指令碼之後,看掃描圖片的PDF電子書就不需要打字記筆記了~吼吼吼~:)
最後附上完整的代碼
# coding:utf-8import inspectimport win32apiimport osfrom PIL import ImageGrab, Imageimport pyHook # 鉤子~import pythoncomimport pytesseract # Image Recognition文字包import pyperclip# 建立一個座標列表coordinate = [1, 1, 1, 1]# 監聽鍵盤事件def on_mouse_event(event): # 擷取當前檔案路徑 file_ = inspect.getfile(inspect.currentframe()) dir_path = os.path.abspath(os.path.dirname(file_)) file_path = dir_path + '\\read.jpg' # 監聽滑鼠事件 if event.MessageName == 'mouse left down': coordinate[0:2] = event.Position elif event.MessageName == 'mouse left up': coordinate[2:4] = event.Position win32api.PostQuitMessage() # 退出監聽迴圈 # 截取座標圖片 pic = ImageGrab.grab(coordinate) pic.save(file_path) text = pytesseract.image_to_string(Image.open(file_path), lang='chi_sim') # 識別並返回 pyperclip.copy(text.replace(' ', '')) # 將識別內容匯入系統剪下板 return True if __name__ == '__main__': hm = pyHook.HookManager() # 建立一個鉤子管理對象 hm.MouseAll = on_mouse_event # 監聽所有滑鼠事件 hm.HookMouse() # 設定滑鼠鉤子 pythoncom.PumpMessages() # 進入迴圈,程式一直監聽
快畢業了,除了準備答辯之外,就是看看書,各種瞎晃~
那麼,這兩天在看書的時候遇到這麼個問題:
首先,部分電子版的書籍是以掃描圖片的形式展現的,在閱讀過程中無法選取文字。對於平時有記錄習慣的我來說,無法複製黏貼真的很不爽!
為瞭解決這個問題,我需要這樣一個指令碼,他有下面這些功能:
1、能夠實現自由
2、能夠識別含有文字的
3、將識別出的文字輸出到剪下板
大致上需要的東西非常明確,那麼,一個一個的來~
作為一項非常實用的功能,自然是有各種各樣的實現,在這裡考慮使用python去完成這個任務,那麼自然是先google一下,網上一搜,果然資料多到爆炸~
不出所料,python對功能做了很好的基礎支援~(本文基於windows平台下的python2實現,python3安裝某些庫真滴煩人)
(1)全屏
那麼先從簡單的做起(稍微麻煩一點,其他部分都超級簡單 = =),首先實現python的“全屏”
代碼入下:
from PIL import ImageGrabim = ImageGrab.grab() # 截取全屏im.save(file)
簡單的三行代碼搞定~(讚美一下前人的偉大_(:з)∠)_)
其中的path表示檔案檔案的完整存放路徑
其中稍微要注意一下的是,安裝庫的時候,使用
pip install pillow(而不是PIL)
否則會顯示找不到匹配的模組~
(PS:這裡其實有個問題,上述代碼運行完成後,並沒有截取全屏,最後產生的圖片僅僅為部分圖片,查看網上攻略後並沒有找到比較好的解決方案,殘念…)
(2)自由
好了,全屏完成,那麼我們其實只想要截取需要的部分就行了,那麼怎麼去完成這個功能呢~
看了一部分網上的做法,最常見的就是監聽滑鼠動作實現選擇地區。其中,其中使用較多的是tkinter,以及pyHook(tkinter實現那個稍微複雜一點),我個人傾向於後者,因為實現起來非常簡單,哈哈~
那麼先上部分代碼
# coding:utf-8import win32apiimport osfrom PIL import ImageGrab, Imageimport pyHookimport pythoncom# 建立一個座標列表(x1,y1,x2,y2)coordinate = [1, 1, 1, 1]# 監聽鍵盤事件def on_mouse_event(event): file_path = 'xx//xx//read.jpg' # 監聽滑鼠事件 if event.MessageName == 'mouse left down': coordinate[0:2] = event.Position elif event.MessageName == 'mouse left up': coordinate[2:4] = event.Position win32api.PostQuitMessage() # 退出監聽迴圈 # 截取座標圖片 pic = ImageGrab.grab(coordinate) pic.save(file_path)
唯一比較麻煩的就是各種庫的安裝,重點點名pywin32這個庫 = =,真姬兒麻煩~
那麼在這裡附上連結,防止安裝過程中可能出現的問題:
解決安裝pywin32後仍然提示找不到模組的問題
文字識別
搞定了功能以後,剩下的工作就比較簡單了。python的pytesseract為文字識別提供了很好的支援。整個實現只需要一行關鍵代碼即可:
from PIL import Imageimport pytesseracttext=pytesseract.image_to_string(Image.open(file_path),lang='chi_sim')print(text)
使用這個庫之前,必須安裝識別引擎tesseract-ocr,下載連結如下(下載完成後為exe安裝包):
tesseract-ocr識別引擎下載
這裡附上安裝及配置環境變數的教程(摘自百度百科):
圖片文字OCR識別-tesseract-ocr4.00.00安裝使用
最後,在pytesseract庫檔案中進行配置,找到F:\XX\XX\XX\你的python安裝路徑\Lib\site-packages\pytesseract
找到該路徑下的pytesseract.py檔案,開啟後找到一下這句代碼:
tesseract_cmd = 'tesseract'
將字串’tesseract’替換成你的tesseract-ocr的安裝路徑(e.g.’F:\Program_File\Tesseract-OCR\tesseract.exe’)
至此,文字識別引擎的全部配置就已經完成了。
訪問剪下板
最後,將識別好的文字匯入剪下板
兩步到位:
(1)pip安裝pyperclip庫
(2)同樣一行代碼:
pyperclip.copy(text) # 將識別內容匯入系統剪下板
大功告成~
總結
整個代碼實現非常的簡潔,總共也就幾十行不到的代碼,這也多虧了python強大的庫支援。
然而比較遺憾的是,功能的實現很是簡陋,使用tkinter可以實現出類似QQ的效果(代碼也相對複雜一些)~
有了這個指令碼之後,看掃描圖片的PDF電子書就不需要打字記筆記了~吼吼吼~:)
最後附上完整的代碼
# coding:utf-8import inspectimport win32apiimport osfrom PIL import ImageGrab, Imageimport pyHook # 鉤子~import pythoncomimport pytesseract # Image Recognition文字包import pyperclip# 建立一個座標列表coordinate = [1, 1, 1, 1]# 監聽鍵盤事件def on_mouse_event(event): # 擷取當前檔案路徑 file_ = inspect.getfile(inspect.currentframe()) dir_path = os.path.abspath(os.path.dirname(file_)) file_path = dir_path + '\\read.jpg' # 監聽滑鼠事件 if event.MessageName == 'mouse left down': coordinate[0:2] = event.Position elif event.MessageName == 'mouse left up': coordinate[2:4] = event.Position win32api.PostQuitMessage() # 退出監聽迴圈 # 截取座標圖片 pic = ImageGrab.grab(coordinate) pic.save(file_path) text = pytesseract.image_to_string(Image.open(file_path), lang='chi_sim') # 識別並返回 pyperclip.copy(text.replace(' ', '')) # 將識別內容匯入系統剪下板 return Trueif __name__ == '__main__': hm = pyHook.HookManager() # 建立一個鉤子管理對象 hm.MouseAll = on_mouse_event # 監聽所有滑鼠事件 hm.HookMouse() # 設定滑鼠鉤子 pythoncom.PumpMessages() # 進入迴圈,程式一直監聽