Python 中這六個圖像文件處理技巧,Pillow 高級用法!
一、圖像處理基礎:Pillow庫簡介與安裝
1. 什么是Pillow?
Pillow是一個功能強大的Python圖像處理庫,能幫我們輕松完成各種圖像操作。比如調整尺寸、添加水印、格式轉換等等!它基于PIL(Python Imaging Library),但更現代、更好用。
舉個例子,想打開一張圖片?用Pillow一句話搞定:
from PIL import Image
img = Image.open("example.jpg") # 打開圖像文件
是不是超簡單?
2. 如何安裝Pillow?
安裝Pillow也很容易,只需運行以下命令:
pip install pillow
如果遇到問題,可以試試升級pip后再安裝:
pip install --upgrade pip
pip install pillow
裝好后,你就可以開始玩轉圖像啦!
二、打開與保存圖像:基本文件操作技巧
1. 使用 Pillow 打開圖像文件
在 Python 中,Pillow 是處理圖像的利器。想打開一張圖片?只需幾行代碼就能搞定!比如下面這個例子:
from PIL import Image
# 打開圖像文件
img = Image.open("example.jpg")
img.show() # 顯示圖像
Image.open() 方法會加載指定路徑的圖像文件,并返回一個圖像對象。
2. 保存圖像到新文件
處理完圖像后,我們通常需要將其保存為新文件。Pillow 讓保存圖像變得非常簡單!來看一個保存為 PNG 格式的例子:
# 將圖像保存為新的格式
img.save("new_image.png")
通過 save() 方法,你可以輕松指定保存路徑和文件格式(如 PNG、JPEG 等)。是不是很方便?
無論是打開還是保存圖像,Pillow 都提供了簡潔而強大的接口,讓你快速上手圖像處理!
三、調整圖像尺寸:縮放與裁剪高級用法
1. 縮放圖像的高級技巧
在調整圖像大小時,Pillow 提供了靈活的 resize 方法。我們可以使用不同的插值算法來優化圖片質量!比如,Image.LANCZOS 是高質量縮放的最佳選擇。來看個例子:
from PIL import Image
# 打開圖片
img = Image.open("example.jpg")
# 使用 LANCZOS 算法縮放至 300x300
resized_img = img.resize((300, 300), Image.LANCZOS)
resized_img.save("resized_example.jpg")
這段代碼將圖片縮放到 300x300 像素,同時保持高質量。
2. 高級裁剪技巧
裁剪圖像可以突出重點區域!通過指定坐標范圍,你可以精確控制裁剪區域。試試這個例子:
# 裁剪圖像 (左, 上, 右, 下)
cropped_img = img.crop((50, 50, 300, 300))
cropped_img.save("cropped_example.jpg")
這里我們從原圖中裁剪出一個 250x250 的區域,位置從 (50, 50) 開始。是不是超簡單?
四、圖像格式轉換:支持現代圖像格式(如WebP)
1. 將圖片轉換為現代WebP格式
WebP是一種高效的現代圖像格式,可以顯著減小文件大小而不損失質量。使用Pillow庫,我們可以輕松將其他格式的圖片轉換為WebP格式。看下面的例子:
from PIL import Image
# 打開一張圖片
img = Image.open("example.jpg")
# 轉換為WebP格式并保存
img.save("example.webp", "WEBP")
這段代碼中,我們先用Image.open()打開一張JPG圖片,再通過save()方法將其保存為WebP格式。是不是很簡單?這種方法特別適合需要優化網站加載速度的場景!
五、添加水印:透明度與位置的精準控制
1. 使用Pillow調整水印透明度
在圖像上添加水印時,透明度的控制非常重要。通過調整水印圖層的Alpha通道,可以讓水印更自然地融入背景圖像。來看一個簡單的例子:
from PIL import Image
# 打開水印圖片并轉換為RGBA模式
watermark = Image.open("watermark.png").convert("RGBA")
# 獲取水印像素數據
data = watermark.getdata()
# 創建新的透明度數據
new_data = []
for item in data:
# 調整透明度(原透明度 * 0.5)
new_data.append((item[0], item[1], item[2], int(item[3] * 0.5)))
# 應用新的透明度數據
watermark.putdata(new_data)
watermark.save("transparent_watermark.png")
以上代碼將水印的透明度降低到一半,效果更加柔和。
2. 精準控制水印位置
除了透明度,水印的位置也很關鍵。我們可以根據主圖像的尺寸動態計算水印的最佳放置點。例如,將水印放在右下角:
from PIL import Image
# 打開主圖像和水印圖像
base_image = Image.open("image.jpg")
watermark = Image.open("transparent_watermark.png")
# 計算水印位置(右下角)
position = (base_image.width - watermark.width, base_image.height - watermark.height)
# 將水印粘貼到主圖像
base_image.paste(watermark, position, watermark)
base_image.save("watermarked_image.jpg")
通過這種方式,你可以輕松實現水印透明度與位置的精準控制!
六、圖像批量處理:自動化腳本設計
1. 批量調整圖像尺寸
在實際工作中,我們常常需要對一批圖片進行統一的尺寸調整。用 Pillow 的 Image.resize() 方法可以輕松搞定!比如,將所有圖片統一縮放到 800x600:
from PIL import Image
import os
# 定義目標尺寸
target_size = (800, 600)
# 遍歷文件夾中的圖片
for filename in os.listdir("images"):
if filename.endswith(('.png', '.jpg', '.jpeg')): # 篩選圖片格式
img_path = os.path.join("images", filename)
with Image.open(img_path) as img:
resized_img = img.resize(target_size) # 調整尺寸
resized_img.save(f"resized_{filename}") # 保存新文件
這段代碼會遍歷 "images" 文件夾中的所有圖片,并將它們調整為指定尺寸。
2. 自動轉換圖像格式
如果需要將一堆圖片從一種格式轉換成另一種格式(比如從 JPG 轉 PNG),Pillow 也能幫上忙!下面是一個簡單的例子:
from PIL import Image
import os
# 遍歷文件夾中的圖片
for filename in os.listdir("images"):
if filename.endswith(('.jpg', '.jpeg')): # 只處理 JPG 格式
img_path = os.path.join("images", filename)
with Image.open(img_path) as img:
new_filename = os.path.splitext(filename)[0] + ".png" # 修改擴展名
img.save(os.path.join("converted", new_filename)) # 保存為 PNG
運行后,所有 JPG 圖片都會被轉換為 PNG 格式并保存到 "converted" 文件夾中。
3. 批量添加水印
給多張圖片添加水印也是常見的需求。我們可以結合 Pillow 的 Image.paste() 方法來實現透明水印的疊加:
from PIL import Image, ImageDraw
import os
watermark_text = "Your Watermark"
watermark_color = (255, 255, 255, 128) # 半透明白色
for filename in os.listdir("images"):
if filename.endswith(('.png', '.jpg', '.jpeg')):
img_path = os.path.join("images", filename)
with Image.open(img_path).convert("RGBA") as img:
draw = ImageDraw.Draw(img)
width, height = img.size
text_width, text_height = draw.textsize(watermark_text)
position = (width - text_width - 10, height - text_height - 10) # 放置右下角
draw.text(position, watermark_text, fill=watermark_color) # 添加水印
img.save(f"watermarked_{filename}")
這段代碼會在每張圖片的右下角添加半透明的水印文字。
通過這些技巧,你可以輕松設計出高效的圖像批量處理腳本!無論是調整尺寸、轉換格式還是添加水印,Pillow 都能幫你快速完成任務。
七、實戰案例:創建一個圖片處理小程序
1. 小程序功能概述
通過前面章節的學習,我們已經掌握了Pillow庫的基本和高級用法。現在,讓我們動手實現一個小程序!這個小程序可以完成以下任務:調整圖片尺寸、轉換格式、添加水印,并支持批量處理。
示例代碼:
from PIL import Image, ImageDraw, ImageFont
# 功能1:調整圖片尺寸
def resize_image(input_path, output_path, size):
"""調整圖片尺寸"""
with Image.open(input_path) as img:
resized_img = img.resize(size)
resized_img.save(output_path)
# 功能2:添加水印
def add_watermark(input_path, output_path, text):
"""為圖片添加文字水印"""
with Image.open(input_path).convert("RGBA") as img:
txt_layer = Image.new("RGBA", img.size, (255, 255, 255, 0))
draw = ImageDraw.Draw(txt_layer)
font = ImageFont.truetype("arial.ttf", 36) # 字體文件路徑
draw.text((10, 10), text, font=font, fill=(255, 255, 255, 128))
combined = Image.alpha_composite(img, txt_layer)
combined.save(output_path)
# 測試代碼
resize_image("input.jpg", "output_resized.jpg", (300, 300)) # 調整尺寸
add_watermark("input.jpg", "output_watermarked.jpg", "Sample Watermark") # 添加水印
輸出結果:運行后,output_resized.jpg 是調整尺寸后的圖片,而 output_watermarked.jpg 是帶有水印的圖片。
解釋:
- resize_image() 函數使用了 img.resize() 方法來調整圖片尺寸。
- add_watermark() 函數通過創建透明圖層并繪制文字,實現了水印功能。
這個小程序簡單實用,適合初學者練習!