Python的PIL對象crop函數(shù)的實現(xiàn)示例
一、函數(shù)基礎(chǔ)解析
PIL庫(Python Imaging Library)的Image.crop()方法是圖像處理的核心工具,通過定義四元組坐標(biāo)實現(xiàn)矩形區(qū)域裁剪。函數(shù)簽名如下:
cropped_image = img.crop(box)
其中box=(left, upper, right, lower)為裁剪區(qū)域的邊界坐標(biāo):
- 坐標(biāo)系統(tǒng):左上角為原點(0,0),向右為X軸正方向,向下為Y軸正方向
- 參數(shù)規(guī)則:坐標(biāo)值必須為整數(shù),且
right需大于left,lower需大于upper,否則觸發(fā)SystemError: tile cannot extend outside image
二、核心參數(shù)詳解
- 坐標(biāo)定位原理
以384x384圖像中心裁剪256x256區(qū)域為例:center_x, center_y = img.size[0]//2, img.size[1]//2 box = (center_x-128, center_y-128, center_x+128, center_y+128)
- 邊界處理邏輯
當(dāng)裁剪區(qū)域超出圖像邊界時,PIL會自動截斷至有效范圍。例如對1920x1200圖像進行左上角裁剪:# 合法裁剪范圍:left∈[0,1920], upper∈[0,1200] cropped = img.crop((0, 0, 3000, 800)) # 實際裁剪區(qū)域調(diào)整為(0,0,1920,800)
三、典型應(yīng)用場景
場景1:九宮格裁剪
from PIL import Image
img = Image.open('flower.jpg')
w, h = img.size
grid_w, grid_h = w//3, h//3
for i in range(3):
for j in range(3):
box = (i*grid_w, j*grid_h, (i+1)*grid_w, (j+1)*grid_h)
region = img.crop(box)
region.save(f'grid_{i}_{j}.png')
場景2:動態(tài)坐標(biāo)計算
通過元素定位實現(xiàn)精準(zhǔn)裁剪(如網(wǎng)頁截圖元素提?。?/p>
from selenium import webdriver
from PIL import Image
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.save_screenshot('baidu.png')
element = driver.find_element_by_id('su')
location = element.location
size = element.size
img = Image.open('baidu.png')
cropped = img.crop((
location['x'],
location['y'],
location['x'] + size['width'],
location['y'] + size['height']
))
cropped.save('button.png')
四、常見問題解決方案
- 坐標(biāo)偏移問題
顯示比例非100%時需強制縮放:driver.execute_script('document.body.style.zoom="0.8"') - 格式兼容問題
TIFF格式建議改用OpenCV處理:import cv2 img = cv2.imread('image.tif') cropped = img[100:300, 200:400] # (y1:y2, x1:x2) cv2.imwrite('cropped.tif', cropped) - 高性能裁剪
批量處理時建議使用ImageChops優(yōu)化:from PIL import ImageChops mask = Image.new('L', img.size, 0) draw = ImageDraw.Draw(mask) draw.rectangle(box, fill=255) cropped = ImageChops.multiply(img, mask)
五、進階技巧
- 非矩形裁剪:通過
Image.paste()配合透明蒙版實現(xiàn) - 坐標(biāo)系轉(zhuǎn)換:使用
img.size動態(tài)計算相對坐標(biāo) - Exif方向處理:自動校正圖像旋轉(zhuǎn)方向
if img.getexif().get(0x0112) in [3,6,8]: img = img.transpose(Image.ROTATE_90)
通過系統(tǒng)掌握crop()函數(shù)的參數(shù)特性與邊界處理邏輯,結(jié)合具體場景的坐標(biāo)計算方法,可高效完成從基礎(chǔ)裁剪到復(fù)雜圖像處理的各類任務(wù)。實踐建議從簡單矩形裁剪入手,逐步掌握動態(tài)坐標(biāo)計算、格式兼容處理等進階技巧,最終實現(xiàn)專業(yè)級的圖像處理能力。
到此這篇關(guān)于Python的PIL對象crop函數(shù)的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python的PIL對象crop函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 中 requests 與 aiohttp 在實際項目中的
本文主要介紹了Python爬蟲開發(fā)中常用的兩個庫requests和aiohttp的使用方法及其區(qū)別,通過實際項目案例展示了這兩個庫的應(yīng)用,并從并發(fā)需求、項目復(fù)雜度、維護成本和性能要求等方面提出了在實際項目中選擇這兩個庫的策略,感興趣的朋友一起看看吧2025-01-01
nlp計數(shù)法應(yīng)用于PTB數(shù)據(jù)集示例詳解
這篇文章主要為大家介紹了nlp計數(shù)法應(yīng)用于PTB數(shù)據(jù)集示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04
python 代碼實現(xiàn)k-means聚類分析的思路(不使用現(xiàn)成聚類庫)
這篇文章主要介紹了python 代碼實現(xiàn)k-means聚類分析(不使用現(xiàn)成聚類庫),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
Python Django 添加首頁尾頁上一頁下一頁代碼實例
這篇文章主要介紹了Python Django 添加首頁尾頁上一頁下一頁代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
python如何在pygame中設(shè)置字體并顯示中文詳解
再簡單的游戲界面中均涉及文字處理,下面這篇文章主要給大家介紹了關(guān)于python如何在pygame中設(shè)置字體并顯示中文的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01

