最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python開發(fā)一個圖片OCR管理和文章下載工具

 更新時間:2025年12月26日 08:56:27   作者:winfredzhang  
在日常工作中,我們經(jīng)常面臨兩個零碎但繁瑣的需求,一是管理大量的OCR(文字識別)圖片素材,二是看到優(yōu)質(zhì)的公眾號文章,想把里面的圖片批量下載下來保存素材,下面我們就來看看如何使用Python將這兩個功能整合到一個工具中吧

在日常工作中,我們經(jīng)常面臨兩個零碎但繁瑣的需求:一是管理大量的OCR(文字識別)圖片素材,需要頻繁查看、縮放圖片并保存識別結(jié)果;二是看到優(yōu)質(zhì)的公眾號文章,想把里面的圖片批量下載下來保存素材。

今天,我將通過一個完整的 Python GUI 項目,分享如何使用 wxPython 將這兩個功能整合到一個工具中。我們將重點分析如何自定義支持縮放/拖拽的圖片控件、實現(xiàn)“智能保存”邏輯以及編寫多線程爬蟲。

技術(shù)棧概覽

GUI 框架: wxPython (主要用于界面構(gòu)建)

圖像處理: Pillow (PIL) (用于圖片加載和預(yù)處理)

網(wǎng)絡(luò)爬蟲: requests + BeautifulSoup4 (用于抓取微信文章)

系統(tǒng)交互: subprocess (調(diào)用外部OCR程序), threading (防界面卡死)

架構(gòu)設(shè)計

程序的主體結(jié)構(gòu)采用 wx.Notebook(選項卡)布局,將應(yīng)用分為兩個獨立的 Panel:

OCRPanel: 負責(zé)圖片導(dǎo)入、預(yù)覽、調(diào)用外部OCR工具以及工程文件的保存(JSON格式)。

DownloaderPanel: 負責(zé)解析微信文章URL,批量下載圖片。

核心亮點一:自定義可縮放、拖拽的圖片畫布 (ImageCanvas)

在早期的 wxPython 開發(fā)中,我們常用 wx.StaticBitmap 顯示圖片,但它不支持縮放和移動,查看大圖細節(jié)非常不便。為了解決這個問題,我重寫了一個 ImageCanvas 類。

1. 原理分析

這個控件繼承自 wx.Panel,核心在于綁定 EVT_PAINT 事件,使用 wx.GraphicsContext 進行高性能繪圖。

平移(Pan): 監(jiān)聽 EVT_MOTION 和鼠標(biāo)點擊事件,計算鼠標(biāo)移動的 dx 和 dy,更新圖片的繪制偏移量 offset_x 和 offset_y。

縮放(Zoom): 監(jiān)聽 EVT_MOUSEWHEEL。當(dāng)滾輪滾動時,更新 self.scale 變量。

2. 代碼解析

def on_paint(self, event):
    dc = wx.BufferedPaintDC(self) # 使用雙緩沖防止閃爍
    dc.Clear()
    
    if self.image:
        gc = wx.GraphicsContext.Create(dc)
        if gc:
            gc.PushState()
            # 核心變換邏輯:先平移,再縮放
            gc.Translate(self.offset_x, self.offset_y)
            gc.Scale(self.scale, self.scale)
            
            bmp = wx.Bitmap(self.image)
            gc.DrawBitmap(bmp, 0, 0, self.image.GetWidth(), self.image.GetHeight())
            gc.PopState()

這段代碼的精髓在于 wx.GraphicsContext,它讓我們不需要手動計算每個像素的位置,而是通過矩陣變換(Translate/Scale)輕松實現(xiàn)視圖操作。

核心亮點二:工程文件的“智能保存”邏輯

在許多工具軟件中,每次點擊保存都彈出“另存為”對話框是非常糟糕的體驗。我們在 OCRPanel 中實現(xiàn)了類似 Word 的保存邏輯。

1. 狀態(tài)管理

我們在類中增加了一個變量 self.current_project_file 來記錄當(dāng)前工程是否已經(jīng)關(guān)聯(lián)了磁盤上的文件。

2. 邏輯流

新建/清空時:將 self.current_project_file 置為 None。

點擊保存時:

Case A (已有文件): 如果 current_project_file 存在,直接寫入 JSON,不彈窗。

Case B (新文件): 彈出 wx.TextEntryDialog 詢問工程名,保存成功后更新 current_project_file。

def on_save_project(self, event):
    # ... 省略數(shù)據(jù)收集代碼 ...

    # 智能判斷:是“保存”還是“另存為”
    if self.current_project_file and os.path.exists(self.current_project_file):
        # === 直接保存 ===
        with open(self.current_project_file, 'w', encoding='utf-8') as f:
            json.dump(self.current_project, f, ...)
    else:
        # === 新建工程,詢問名稱 ===
        dlg = wx.TextEntryDialog(self, "請輸入工程名稱:", "保存新工程")
        if dlg.ShowModal() == wx.ID_OK:
            # ... 保存并更新 self.current_project_file ...

核心亮點三:健壯的微信文章圖片獲取

微信公眾號文章的圖片下載有兩個難點:懶加載(Lazy Load)和防盜鏈參數(shù)。

1. 對抗懶加載

微信文章的 HTML 中,真實的圖片 URL 通常不在 src 屬性中(src 往往是一個占位圖),而是藏在 data-src 中。我們的爬蟲采用了多重策略提取 URL:

BeautifulSoup 解析: 優(yōu)先查找 data-src、data-original 等屬性。

正則兜底: 如果 HTML 解析遺漏,使用正則表達式 re.findall 直接從源碼中暴力匹配 https://mmbiz.qpic.cn/... 格式的鏈接。

2. URL 清洗

微信圖片 URL 往往帶有大量的參數(shù)(如 tp=webp),直接下載可能導(dǎo)致格式混亂。代碼中實現(xiàn)了 clean_image_url 方法,提取基礎(chǔ) URL,并根據(jù) Content-Type 智能判斷文件后綴(.jpg, .png, .gif)。

3. 多線程防卡死

GUI 程序最忌諱在主線程進行網(wǎng)絡(luò)請求。我們在 DownloaderPanel 中使用了 threading:

# 錯誤做法:直接調(diào)用下載函數(shù),界面會卡死直到下載完成
# self.download_images(url, save_path) 

# 正確做法:開啟新線程
threading.Thread(target=self.run_download_task, args=(url, save_path)).start()

同時,為了在子線程中安全地更新 UI(如進度條),我們使用了 wx.CallAfter,確保 UI 操作回到主線程執(zhí)行。

運行結(jié)果

到此這篇關(guān)于使用Python開發(fā)一個圖片OCR管理和文章下載工具的文章就介紹到這了,更多相關(guān)Python圖片OCR管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python3連接MySQL數(shù)據(jù)庫實例詳解

    python3連接MySQL數(shù)據(jù)庫實例詳解

    這篇文章主要為大家詳細介紹了python3連接MySQL數(shù)據(jù)庫實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python?urllib?入門使用詳細教程

    Python?urllib?入門使用詳細教程

    urllib?庫,它是?Python?內(nèi)置的?HTTP?請求庫,不需要額外安裝即可使用,這篇文章主要介紹了Python?urllib?入門使用,需要的朋友可以參考下
    2022-11-11
  • python列表切片和嵌套列表取值操作詳解

    python列表切片和嵌套列表取值操作詳解

    今天小編就為大家分享一篇python列表切片和嵌套列表取值操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python matplotlib實現(xiàn)雙Y軸的實例

    python matplotlib實現(xiàn)雙Y軸的實例

    今天小編就為大家分享一篇python matplotlib實現(xiàn)雙Y軸的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python文本處理之按行處理大文件的方法

    Python文本處理之按行處理大文件的方法

    下面小編就為大家分享一篇Python文本處理之按行處理大文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 在VSCode中添加Python解釋器并安裝Python庫的方法

    在VSCode中添加Python解釋器并安裝Python庫的方法

    這篇文章主要介紹了在VSCode中添加Python解釋器并安裝Python庫的方法,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • python使用Pandas庫提升項目的運行速度過程詳解

    python使用Pandas庫提升項目的運行速度過程詳解

    這篇文章主要介紹了python使用Pandas庫提升項目的運行速度過程詳解,這是一篇關(guān)于“如何充分利用Pandas內(nèi)置的強大且易于上手的特性”的指引。此外,你將學(xué)習(xí)到一些實用的節(jié)省時間的技巧,需要的朋友可以參考下
    2019-07-07
  • Flask 上傳自定義頭像的實例詳解

    Flask 上傳自定義頭像的實例詳解

    今天小編就為大家分享一篇Flask 上傳自定義頭像的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 深入了解Python中frozenset的功能與用法

    深入了解Python中frozenset的功能與用法

    在Python中,frozenset是一種與set類似的數(shù)據(jù)類型,但具有不可變性,本文將詳細介紹frozenset的作用、用法以及與set的區(qū)別,感興趣的可以了解下
    2024-01-01
  • pytorch finetuning 自己的圖片進行訓(xùn)練操作

    pytorch finetuning 自己的圖片進行訓(xùn)練操作

    這篇文章主要介紹了pytorch finetuning 自己的圖片進行訓(xùn)練操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

武川县| 溧阳市| 梓潼县| 太和县| 新津县| 镇原县| 香河县| 巨鹿县| 阿克苏市| 锡林郭勒盟| 连州市| 新建县| 奉贤区| 广宗县| 皮山县| 察雅县| 罗平县| 乳山市| 乐亭县| 逊克县| 六枝特区| 怀集县| 延庆县| 老河口市| 定兴县| 柘城县| 双牌县| 通河县| 五指山市| 松潘县| 保定市| 沙河市| 二连浩特市| 孝感市| 云南省| 长寿区| 宜良县| 中牟县| 文昌市| 宝清县| 延寿县|