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

使用Python批量處理圖片的實戰(zhàn)指南

 更新時間:2026年03月27日 10:49:35   作者:站大爺IP  
當(dāng)Word文檔里的圖片成了攔路虎,這種時候,Python就派上用場了,它不會抱怨重復(fù)勞動,也不會因為眼花點錯圖片,下面我們就來看看如何使用Python腳本實現(xiàn)批量處理圖片吧

你有沒有遇到過這樣的場景:部門例會前,領(lǐng)導(dǎo)丟給你一個文件夾,里面是幾十個Word文檔,每個文檔里都散落著好幾張活動照片。你的任務(wù)很簡單——把所有圖片提取出來,統(tǒng)一調(diào)整尺寸,再按照特定的順序塞進(jìn)一個新的報告文檔里。

聽起來不難,對吧?但當(dāng)你打開第一個文檔,一張張右鍵另存為,再調(diào)整尺寸,再復(fù)制粘貼到新文檔……重復(fù)幾十次之后,你會開始懷疑人生。手頭的工作變成了純粹的體力勞動,而且只要有一個環(huán)節(jié)出錯,就得從頭再來。

這種時候,Python就派上用場了。它不會抱怨重復(fù)勞動,也不會因為眼花點錯圖片。我花了兩個小時寫了一小段腳本,把原本一整天的手工活壓縮成了三分鐘。今天就把這段經(jīng)歷和代碼拆開來講,希望能幫你擺脫同樣的困境。

準(zhǔn)備工作:裝好工具箱

在動手之前,得先把需要用到的工具裝上。Python的好處就是有大量的第三方庫,專門解決這類問題。這次我們需要三個幫手:

pip install python-docx pillow

python-docx是我們操作Word文檔的主力。它可以讀取文檔里的文字、表格、圖片,也能從頭創(chuàng)建新的文檔或者修改現(xiàn)有的文檔。Pillow是Python圖像處理庫,負(fù)責(zé)調(diào)整圖片尺寸、轉(zhuǎn)換格式這些活兒。

安裝完成之后,在代碼開頭把這些庫引進(jìn)來:

from docx import Document
from docx.shared import Inches, Cm
from PIL import Image
import io
import os

InchesCm是用來設(shè)置圖片大小的單位,io幫我們處理內(nèi)存里的圖片數(shù)據(jù),os負(fù)責(zé)管理文件和文件夾路徑。

從Word文檔里“撈”出圖片

Word文檔和圖片的關(guān)系,比看起來要復(fù)雜一點。你可能會想,圖片不就是放在文檔里的嗎?但當(dāng)我們用代碼去讀取時,需要找到正確的“門路”。

每個.docx文件其實是個壓縮包,圖片被藏在內(nèi)部的media文件夾里,通過XML關(guān)系與文檔內(nèi)容關(guān)聯(lián)。python-docx提供了一個方法,可以順著這個關(guān)系把圖片提取出來。

下面這段代碼能遍歷一個文件夾里所有的Word文檔,把每張圖片提取出來,按照“文檔名_圖片序號.jpg”的格式保存:

def extract_images_from_docx(folder_path):
    # 遍歷文件夾里所有docx文件
    for filename in os.listdir(folder_path):
        if not filename.endswith('.docx'):
            continue
            
        doc_path = os.path.join(folder_path, filename)
        doc = Document(doc_path)
        
        # 準(zhǔn)備一個文件夾存放提取出的圖片
        img_folder = os.path.join(folder_path, filename.replace('.docx', '_images'))
        if not os.path.exists(img_folder):
            os.makedirs(img_folder)
        
        img_count = 0
        # 遍歷文檔中的所有段落
        for paragraph in doc.paragraphs:
            for run in paragraph.runs:
                # 在run的XML中查找圖片標(biāo)記
                blip = run._r.find('.//a:blip', 
                    namespaces={'a': 'http://schemas.openxmlformats.org/drawingml/2006/main'})
                if blip is not None:
                    embed_id = blip.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed')
                    if embed_id and embed_id in run.part.related_parts:
                        image_part = run.part.related_parts[embed_id]
                        img_stream = io.BytesIO(image_part.blob)
                        img = Image.open(img_stream)
                        
                        img_count += 1
                        img_path = os.path.join(img_folder, f'image_{img_count}.jpg')
                        img.save(img_path, 'JPEG')
                        print(f'已提取: {img_path}')
        
        print(f'{filename} 處理完成,共提取 {img_count} 張圖片')

這段代碼的核心是那個看起來很復(fù)雜的XML查找。簡單解釋一下:Word文檔的內(nèi)部結(jié)構(gòu)是用XML描述的,圖片會被標(biāo)記為<a:blip>元素,通過embed屬性關(guān)聯(lián)到實際的圖片數(shù)據(jù)。我們把圖片數(shù)據(jù)從內(nèi)存里讀出來,用Pillow打開,再保存到本地,就完成了提取。

批量處理圖片:統(tǒng)一尺寸和格式

提取出來的圖片可能大小不一,有的橫版有的豎版,如果直接塞進(jìn)文檔里會很難看。我們可以統(tǒng)一調(diào)整尺寸,讓它們都變成一樣的寬度,高度按比例自動縮放。

def resize_images(image_folder, output_width=500):
    # 獲取文件夾里所有圖片
    image_files = [f for f in os.listdir(image_folder) 
                   if f.endswith(('.jpg', '.jpeg', '.png'))]
    
    for img_file in image_files:
        img_path = os.path.join(image_folder, img_file)
        img = Image.open(img_path)
        
        # 計算等比例縮放后的高度
        original_width, original_height = img.size
        new_height = int(output_width * original_height / original_width)
        
        # 使用高質(zhì)量縮放算法
        resized_img = img.resize((output_width, new_height), Image.Resampling.LANCZOS)
        
        # 覆蓋原圖或者保存為新文件
        resized_img.save(img_path, quality=95)
        print(f'已調(diào)整尺寸: {img_file} -> {output_width}x{new_height}')

這里用了Image.Resampling.LANCZOS,這是Pillow里質(zhì)量最高的縮放算法,雖然慢一點,但效果最好。如果你的圖片數(shù)量特別多,可以考慮用Image.Resampling.BILINEAR換速度。

把圖片塞回新文檔

圖片都準(zhǔn)備好了,現(xiàn)在要把它們按照順序插進(jìn)一個新的Word文檔里。python-docx插入圖片的方法很直觀,用add_picture就行:

def create_photo_report(image_folder, output_path='report.docx'):
    # 創(chuàng)建新文檔
    doc = Document()
    
    # 添加標(biāo)題
    doc.add_heading('活動照片集錦', 0)
    
    # 獲取所有圖片文件并排序
    image_files = sorted([f for f in os.listdir(image_folder) 
                          if f.endswith(('.jpg', '.jpeg', '.png'))])
    
    for img_file in image_files:
        img_path = os.path.join(image_folder, img_file)
        
        # 添加一個段落,放圖片說明
        doc.add_heading(img_file.replace('_', ' ').replace('.jpg', ''), level=2)
        
        # 插入圖片,寬度設(shè)為6英寸,高度自動縮放
        doc.add_picture(img_path, width=Inches(6))
        
        # 添加一點留白
        doc.add_paragraph()
    
    doc.save(output_path)
    print(f'報告已生成: {output_path}')

add_picturewidth參數(shù)可以接受Inches、CmPt單位。如果你想讓圖片按固定高度插入,也可以用height參數(shù)。只指定一個維度時,另一個維度會自動等比縮放,不用自己算。

進(jìn)階技巧:在指定位置插入圖片

有些時候,光是把圖片堆在文檔末尾不夠用。你可能需要把圖片插到某個段落后邊,或者放到表格的某個單元格里。

在段落里插圖片,關(guān)鍵是先拿到那個段落,然后在它的run里添加:

# 假設(shè)我們要在文檔的第一個段落之后插入圖片
doc = Document('existing.docx')
target_paragraph = doc.paragraphs[0]  # 獲取第一個段落
run = target_paragraph.add_run()       # 在段落中創(chuàng)建一個新run
run.add_picture('image.jpg', width=Inches(3))  # 插入圖片

在表格里插圖片也類似,先定位到單元格,再操作:

table = doc.add_table(rows=2, cols=2)
cell = table.cell(0, 0)  # 第一行第一列
paragraph = cell.paragraphs[0]
run = paragraph.add_run()
run.add_picture('image.jpg', width=Cm(5))

需要注意的是,python-docx對圖片位置的精確控制能力有限,沒辦法像手動操作那樣任意拖拽到指定坐標(biāo)。如果對排版有很高要求,可以先通過代碼把圖片插入到位,再用Word手動微調(diào)。

處理那些煩人的“坑”

實際應(yīng)用中總會遇到一些意外情況,比如文檔里有浮動圖片、文檔是舊的.doc格式等等。這里說幾個常見坑的應(yīng)對方法。

浮動圖片提取不到:上面那種通過段落查找的方法只能提取“嵌入型”圖片。如果文檔里有浮在文字上方的圖片,需要更底層的操作。可以用python-docxpart.related_parts遍歷所有資源,找到圖片類型就保存。一個更簡單但笨一點的辦法是:先把文檔另存為.docx,用壓縮軟件打開,直接去word/media文件夾里復(fù)制圖片。

遇到.doc格式:python-docx只支持.docx,處理不了舊版.doc文件。可以先用win32com庫在Windows上轉(zhuǎn)換,或者用LibreOffice的命令行工具批量轉(zhuǎn)換。如果只是偶爾遇到,手動轉(zhuǎn)一下可能更快。

圖片插入后變形:這通常是因為給圖片設(shè)置了固定的寬高,但比例和原圖不一致。解決辦法是只設(shè)置一個維度,讓另一個維度自動縮放。如果必須指定兩個維度,可以先用Pillow讀取原圖尺寸,再手動計算縮放后的寬高。

寫在最后

回到開頭的場景,當(dāng)你再次面對幾十個需要處理圖片的Word文檔時,你可以選擇繼續(xù)手工操作,也可以寫一段腳本,然后去泡杯咖啡,等著它幫你把一切做完。

Python自動化最大的魅力就在這里——它不是為了炫技,而是為了把我們從重復(fù)勞動里解放出來,去做那些真正需要思考和創(chuàng)造的事情。這次我們只用了python-docxPillow兩個庫,但你能做的事情遠(yuǎn)不止提取和插入圖片。

想想你日常工作里那些“反復(fù)做、費時間、有規(guī)律”的事情,很可能都可以用類似的方式自動化。批量生成合同、整理數(shù)據(jù)報表、統(tǒng)一修改文檔格式……這些場景里,Python都能成為你的得力助手。

到此這篇關(guān)于使用Python批量處理圖片的實戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Python批量處理圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 的 sum() Pythonic 的求和方法詳細(xì)

    Python 的 sum() Pythonic 的求和方法詳細(xì)

    Python 的內(nèi)置函數(shù)sum()是一種對數(shù)值列表求和的有效且Pythonic 的方法。將多個數(shù)字相加是許多計算中常見的中間步驟,因此sum()對于 Python 程序員來說是一個非常方便的工具。下面文章就讓我們一起來看具體內(nèi)容吧
    2021-10-10
  • Python中單、雙下劃線的區(qū)別總結(jié)

    Python中單、雙下劃線的區(qū)別總結(jié)

    這篇文章主要給大家介紹了關(guān)于Python中單、雙下劃線區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • python使用itchat庫實現(xiàn)微信機器人(好友聊天、群聊天)

    python使用itchat庫實現(xiàn)微信機器人(好友聊天、群聊天)

    itchat是一個開源的微信個人號接口,可以使用該庫進(jìn)行微信網(wǎng)頁版中的所有操作。本文主要使用該庫完成一個能夠處理微信消息的的圖靈機器人,包括好友聊天、群聊天,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2018-01-01
  • Python多線程threading創(chuàng)建及使用方法解析

    Python多線程threading創(chuàng)建及使用方法解析

    這篇文章主要介紹了Python多線程threading創(chuàng)建及使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • windows python嵌入式安裝全過程

    windows python嵌入式安裝全過程

    文章介紹了嵌入式安裝包的概念,包括嵌入式Python和如何創(chuàng)建嵌入式安裝包,嵌入式Python是一個精簡版的Python解釋器,可以在沒有安裝Python的環(huán)境中運行,文章還提供了下載和配置嵌入式Python的詳細(xì)步驟,包括從官網(wǎng)下載安裝包、下載get-pip.py、配置文件和環(huán)境變量等
    2024-11-11
  • 基于Python實現(xiàn)繪制簡單動圖的示例詳解

    基于Python實現(xiàn)繪制簡單動圖的示例詳解

    動畫是一種高效的可視化工具,能夠提升用戶的吸引力和視覺體驗,有助于以富有意義的方式呈現(xiàn)數(shù)據(jù)可視化,本文的主要介紹在Python中兩種簡單制作動圖的方法,需要的可以了解下
    2023-10-10
  • 在python中創(chuàng)建指定大小的多維數(shù)組方式

    在python中創(chuàng)建指定大小的多維數(shù)組方式

    今天小編就為大家分享一篇在python中創(chuàng)建指定大小的多維數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python實現(xiàn)JAVA源代碼從ANSI到UTF-8的批量轉(zhuǎn)換方法

    python實現(xiàn)JAVA源代碼從ANSI到UTF-8的批量轉(zhuǎn)換方法

    這篇文章主要介紹了python實現(xiàn)JAVA源代碼從ANSI到UTF-8的批量轉(zhuǎn)換方法,涉及Python針對文件操作與編碼轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下
    2015-08-08
  • Python實現(xiàn)動態(tài)柱狀圖的繪制

    Python實現(xiàn)動態(tài)柱狀圖的繪制

    這篇文章主要為大家詳細(xì)介紹了Python實現(xiàn)動態(tài)柱狀圖的繪制的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)與借鑒價值,需要的可以參考一下
    2022-12-12
  • Python使用高德地圖API批量獲取地址所屬街道并寫回Excel

    Python使用高德地圖API批量獲取地址所屬街道并寫回Excel

    借助 Python + 高德地圖API,我們可以輕松實現(xiàn)自動化批量查詢并將結(jié)果寫入 Excel 文件中,下面就跟隨小編一起來看看具體實現(xiàn)方法與思路吧
    2025-11-11

最新評論

普格县| 汝阳县| 长葛市| 汉源县| 邛崃市| 成安县| 泸定县| 梁河县| 阿荣旗| 米泉市| 朝阳县| 濮阳市| 乾安县| 班玛县| 宁蒗| 扶余县| 宝山区| 仙桃市| 大连市| 阳朔县| 彩票| 滁州市| 南充市| 仁化县| 兴宁市| 泽库县| 雷山县| 大埔县| 资中县| 虞城县| 菏泽市| 唐山市| 茶陵县| 苏尼特左旗| 南昌市| 那曲县| 西青区| 英德市| 丹棱县| 迁安市| 皮山县|