亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python使用PIL庫實現(xiàn)圖像圓形裁剪

 更新時間:2025年07月16日 10:43:40   作者:nightunderblackcat  
本文將詳細介紹如何使用Python的Pillow庫(PIL)實現(xiàn)一個實用的圖像處理任務——將圖片裁剪為圓形,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

本文將詳細介紹如何使用Python的Pillow庫(PIL)實現(xiàn)一個實用的圖像處理任務——將圖片裁剪為圓形。這個功能在創(chuàng)建用戶頭像、產(chǎn)品展示等場景中非常常見。

本教程面向Python初學者,假設讀者已具備基本的Python語法知識。我們將從環(huán)境準備開始,逐步解析代碼的每一部分,確保讀者不僅能理解代碼的功能,還能掌握背后的原理。

環(huán)境準備

在開始之前,我們需要確保已安裝必要的Python庫。本教程主要使用Pillow庫(Python Imaging Library的分支版本),它是Python中最流行的圖像處理庫之一。

安裝Pillow

打開命令行或終端,輸入以下命令安裝Pillow:

pip install pillow

安裝完成后,可以通過以下命令驗證是否安裝成功:

from PIL import Image
print(Image.__version__)

如果沒有報錯并顯示版本號,則說明安裝成功。

代碼結(jié)構概覽

我們將要分析的代碼主要完成以下功能:

  • 指定輸入和輸出文件夾路徑
  • 創(chuàng)建輸出文件夾(如果不存在)
  • 遍歷輸入文件夾中的所有圖片文件
  • 將每張圖片裁剪為圓形
  • 保存處理后的圖片到輸出文件夾

讓我們逐部分詳細解析這段代碼。

代碼詳細解析

1. 導入必要的庫

from PIL import Image, ImageDraw
import os
  • PIL.Image:Pillow庫的核心模塊,用于打開、操作和保存多種圖像格式
  • PIL.ImageDraw:提供基本的2D圖形繪制功能,用于創(chuàng)建圓形蒙版
  • os:Python標準庫,提供與操作系統(tǒng)交互的功能,主要用于文件路徑操作

2. 設置輸入輸出路徑

input_folder = r'E:\Downloads\壓縮文件'
output_folder = r'E:\Downloads\西游記111'
  • input_folder:原始圖片所在的文件夾路徑
  • output_folder:處理后的圖片保存路徑
  • r前綴:表示原始字符串(raw string),避免轉(zhuǎn)義字符(如\n)被特殊處理

注意事項

路徑中使用雙反斜杠\\或原始字符串r''是Windows系統(tǒng)中的常見做法

在實際應用中,這些路徑應作為參數(shù)或配置文件項,而非硬編碼

3. 創(chuàng)建輸出目錄

if not os.path.exists(output_folder):
    os.makedirs(output_folder)
  • os.path.exists():檢查路徑是否存在
  • os.makedirs():創(chuàng)建目錄(包括所有必要的父目錄)

最佳實踐

  • 總是檢查目錄是否存在再創(chuàng)建,避免不必要的異常
  • 考慮添加錯誤處理,例如權限不足等情況

4. 遍歷輸入文件夾

for filename in os.listdir(input_folder):
    if filename.endswith(('.png', '.jpg', '.jpeg')):  # 支持常見的圖片格式
  • os.listdir():列出目錄中的所有文件和子目錄
  • str.endswith():檢查文件名是否以指定后綴結(jié)尾(支持元組形式的多后綴匹配)

擴展說明

  • 可以添加更多圖片格式如.bmp.webp
  • 考慮使用os.path.splitext()獲取文件擴展名進行更精確的匹配

5. 打開并預處理圖片

img_path = os.path.join(input_folder, filename)
img = Image.open(img_path)
 
size = min(img.size)
img = img.resize((size, size))  # 縮放圖片為正方形
  • os.path.join():跨平臺安全的路徑拼接方法
  • Image.open():打開圖像文件但不立即讀取數(shù)據(jù)(延遲加載)
  • img.size:返回圖像的(寬度, 高度)元組
  • min():獲取較小的邊長
  • resize():調(diào)整圖像尺寸

圖像處理原理

  • 圓形裁剪需要正方形作為基礎,因此先獲取最小邊作為正方形邊長
  • resize()默認使用Image.NEAREST(最近鄰插值),可指定更高質(zhì)量的方法如Image.BICUBIC

6. 創(chuàng)建圓形蒙版

mask = Image.new('L', (size, size), 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((0, 0, size, size), fill=255)

Image.new():創(chuàng)建新圖像

  • 模式'L':8位灰度像素(0黑,255白)
  • 初始填充值0:黑色背景

ImageDraw.Draw():創(chuàng)建繪圖對象

ellipse():繪制橢圓/圓形

  • 參數(shù):(左上x, 左上y, 右下x, 右下y)
  • fill=255:白色填充

蒙版概念

蒙版是圖像處理中的常見技術,用于定義哪些區(qū)域應該顯示/隱藏

在Pillow中,蒙版通常使用灰度圖像,其中:

  • 255(白):完全顯示
  • 0(黑):完全透明
  • 中間值:部分透明

7. 應用蒙版創(chuàng)建圓形圖像

img_with_circle = Image.new("RGBA", (size, size), (0, 0, 0, 0))
img_with_circle.paste(img, (0, 0), mask)

Image.new("RGBA"):創(chuàng)建透明背景圖像

  • RGBA模式:Red, Green, Blue, Alpha(透明度)
  • (0,0,0,0):完全透明黑色

paste():粘貼圖像

  • 第一個參數(shù):要粘貼的圖像
  • 第二個參數(shù):位置坐標
  • 第三個參數(shù):蒙版圖像

透明度處理

  • PNG格式支持Alpha通道,因此使用RGBA模式
  • 背景初始化為完全透明,確保圓形外的區(qū)域透明

8. 保存處理后的圖像

new_filename = os.path.splitext(filename)[0] + '.png'
output_path = os.path.join(output_folder, new_filename)
img_with_circle.save(output_path, 'PNG')

os.path.splitext():分割文件名和擴展名

save():保存圖像

  • 指定'PNG'格式以保留透明度
  • 自動根據(jù)擴展名確定格式(但顯式指定更可靠)

文件格式選擇

  • PNG:無損壓縮,支持透明度
  • JPEG:有損壓縮,不支持透明度
  • 可根據(jù)需求調(diào)整輸出格式

9. 進度反饋

print(f"圖片 {filename} 裁剪完成,保存至 {output_path}")
print("所有圖片都已裁剪完成~ (?????)")
  • 提供處理進度反饋
  • 最終完成提示

用戶體驗建議

  • 可添加計數(shù)器顯示進度(如"處理第n張/共m張")
  • 考慮使用更專業(yè)的進度條庫(如tqdm)

完整代碼回顧

from PIL import Image, ImageDraw
import os
 
# 輸入和輸出文件夾路徑
input_folder = r'E:\Downloads\壓縮文件'
output_folder = r'E:\Downloads\西游記111'
 
# 如果輸出文件夾不存在,就創(chuàng)建一個
if not os.path.exists(output_folder):
    os.makedirs(output_folder)
 
# 遍歷輸入文件夾中的所有圖片文件
for filename in os.listdir(input_folder):
    if filename.endswith(('.png', '.jpg', '.jpeg')):  # 支持常見的圖片格式
        # 打開圖片
        img_path = os.path.join(input_folder, filename)
        img = Image.open(img_path)
 
        # 以圖片的最小邊為圓形裁剪的邊長
        size = min(img.size)
        img = img.resize((size, size))  # 縮放圖片為正方形
 
        # 創(chuàng)建一個圓形蒙版
        mask = Image.new('L', (size, size), 0)
        draw = ImageDraw.Draw(mask)
        draw.ellipse((0, 0, size, size), fill=255)  # 繪制白色的圓形
 
        # 創(chuàng)建一個透明背景的圖片
        img_with_circle = Image.new("RGBA", (size, size), (0, 0, 0, 0))  # 背景為透明
        img_with_circle.paste(img, (0, 0), mask)  # 使用圓形蒙版將圖片粘貼到透明背景上
 
        # 生成新的文件名,原文件名加上 "1"
        new_filename = os.path.splitext(filename)[0] + '.png'
        output_path = os.path.join(output_folder, new_filename)
 
        # 保存為PNG格式
        img_with_circle.save(output_path, 'PNG')
 
        print(f"圖片 {filename} 裁剪完成,保存至 {output_path}")
 
print("所有圖片都已裁剪完成~ (?????)")

代碼優(yōu)化建議

參數(shù)化配置:將輸入輸出路徑、支持的文件格式等作為函數(shù)參數(shù)或配置文件

錯誤處理:添加try-catch塊處理可能的異常(如文件損壞、權限問題等)

性能優(yōu)化:對于大量圖片,可考慮并行處理

日志記錄:替代簡單的print語句,使用logging模塊

單元測試:為關鍵功能編寫測試用例

擴展功能思路

自定義形狀:修改代碼支持心形、星形等其他形狀

邊框添加:在圓形圖像周圍添加裝飾性邊框

批量重命名:更靈活的文件命名規(guī)則

預覽功能:處理前顯示預覽

GUI界面:使用Tkinter等庫創(chuàng)建圖形界面

常見問題解答

Q1: 為什么處理后圖片質(zhì)量下降了?

A: 可能是因為resize()使用了默認的最近鄰插值,可嘗試:

img = img.resize((size, size), Image.BICUBIC)

Q2: 如何處理非正方形圖片?

A: 當前代碼會自動取最小邊,也可以選擇:

  • 保持原比例,在圓形外留透明區(qū)域
  • 裁剪中心區(qū)域而非縮放

Q3: 如何支持更多圖片格式?

A: 擴展endswith的元組參數(shù),如:

if filename.endswith(('.png', '.jpg', '.jpeg', '.webp', '.bmp')):

Q4: 處理大圖片時內(nèi)存不足怎么辦?

A: 可以:

  • 限制處理圖片的最大尺寸
  • 使用更高效的內(nèi)存處理方式
  • 分塊處理圖片

總結(jié)

本文詳細解析了一個實用的Python圖像處理腳本,它使用Pillow庫將圖片裁剪為圓形。通過學習這段代碼,我們掌握了:

  • Pillow庫的基本圖像操作
  • 蒙版技術的應用
  • 文件批量處理的模式
  • 透明圖像的處理方法

希望讀者不僅能理解這段代碼,更能舉一反三,應用到其他圖像處理任務中。編程學習的關鍵在于實踐,建議讀者嘗試修改和擴展這段代碼,以鞏固所學知識。

附錄:Pillow庫常用方法速查

方法/屬性說明
Image.open()打開圖像文件
Image.new()創(chuàng)建新圖像
Image.save()保存圖像
Image.resize()調(diào)整尺寸
ImageDraw.Draw()創(chuàng)建繪圖對象
Image.paste()粘貼圖像
img.size圖像尺寸(寬,高)
img.format圖像格式
img.mode圖像模式(RGB, RGBA等)

到此這篇關于Python使用PIL庫實現(xiàn)圖像圓形裁剪的文章就介紹到這了,更多相關Python PIL圖像裁剪內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java虛擬機中棧的運行知識點總結(jié)

    java虛擬機中棧的運行知識點總結(jié)

    在本篇文章里小編給大家整理的是一篇關于java虛擬機中棧的運行知識點總結(jié),有需要的朋友們可以學習參考下。
    2021-06-06
  • 解決windows下Sublime Text 2 運行 PyQt 不顯示的方法分享

    解決windows下Sublime Text 2 運行 PyQt 不顯示的方法分享

    問題描述:PyQt 環(huán)境正常,可以使用 Windows 的 虛擬 DOS 正常運行,但在 Sublime Text 2 下使用 Ctrl + B 運行后,界面不顯示,但查看任務管理器,有 python.exe 進程。
    2014-06-06
  • Python下載ts文件視頻且合并的操作方法

    Python下載ts文件視頻且合并的操作方法

    ts文件,ts即"Transport?Stream"的縮寫,特點就是要求從視頻流的任一片段開始都是可以獨立解碼的,非常適合網(wǎng)絡視頻播放,這篇文章主要介紹了Python下載ts文件視頻且合并,需要的朋友可以參考下
    2023-01-01
  • Python一些線程的玩法總結(jié)

    Python一些線程的玩法總結(jié)

    今天給大家?guī)淼氖顷P于Python的一些知識,文章圍繞著Python線程的玩法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 使用python實現(xiàn)省市三級菜單效果

    使用python實現(xiàn)省市三級菜單效果

    本文給大家分享的是使用使用python實現(xiàn)省市三級菜單效果的代碼,非常的實用,有需要的小伙伴可以參考下。
    2016-01-01
  • Python解決%matplotlib inline標紅底報錯問題

    Python解決%matplotlib inline標紅底報錯問題

    在使用非Jupyter環(huán)境如Spyder或PyCharm時,%matplotlib inline會因為是Jupyter特有的魔法命令而導致報錯,這條命令是用于Jupyter Notebook或Jupyter Qt Console中,主要作用是將matplotlib的圖表直接嵌入到Notebook中顯示
    2024-09-09
  • 初學python數(shù)學建模之數(shù)據(jù)導入(小白篇)

    初學python數(shù)學建模之數(shù)據(jù)導入(小白篇)

    本篇文章是小白篇初學python的同學可以來共同學習了,本篇文章主要講解了python數(shù)學建模過程中的第一步數(shù)據(jù)導入,數(shù)據(jù)導入是所有數(shù)模編程的第一步,比你想象的更重要
    2021-08-08
  • 簡單說明Python中的裝飾器的用法

    簡單說明Python中的裝飾器的用法

    這篇文章主要簡單說明了Python中的裝飾器的用法,裝飾器在Python的進階學習中非常重要,示例代碼基于Python2.x,需要的朋友可以參考下
    2015-04-04
  • 使用python實現(xiàn)下拉選擇框和頁簽的方法

    使用python實現(xiàn)下拉選擇框和頁簽的方法

    ttk是Python中的一個模塊,它提供了一組用于創(chuàng)建GUI界面的工具和控件,這些控件包括按鈕、標簽、文本框等,可以幫助開發(fā)者更方便地創(chuàng)建用戶界面,這篇文章主要介紹了使用python實現(xiàn)下拉選擇框和頁簽的方法,需要的朋友可以參考下
    2023-03-03
  • Python實現(xiàn)控制手機電腦拍照并自動發(fā)送郵箱

    Python實現(xiàn)控制手機電腦拍照并自動發(fā)送郵箱

    這篇文章主要介紹了如何實現(xiàn)利用Python控制手機電腦拍照并自動發(fā)送郵箱,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手試一試
    2022-02-02

最新評論