PIL (Python Imaging Library)
專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來客戶和效益!創(chuàng)新互聯(lián)公司為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)負(fù)責(zé)任的成都網(wǎng)站制作公司!
Python圖像處理庫,該庫支持多種文件格式,提供強(qiáng)大的圖像處理功能。
PIL中最重要的類是Image類,該類在Image模塊中定義。
從文件加載圖像:
如果成功,這個(gè)函數(shù)返回一個(gè)Image對(duì)象。現(xiàn)在你可以使用該對(duì)象的屬性來探索文件的內(nèi)容。
format 屬性指定了圖像文件的格式,如果圖像不是從文件中加載的則為 None 。
size 屬性是一個(gè)2個(gè)元素的元組,包含圖像寬度和高度(像素)。
mode 屬性定義了像素格式,常用的像素格式為:“L” (luminance) - 灰度圖, “RGB” , “CMYK”。
如果文件打開失敗, 將拋出IOError異常。
一旦你擁有一個(gè)Image類的實(shí)例,你就可以用該類定義的方法操作圖像。比如:顯示
( show() 的標(biāo)準(zhǔn)實(shí)現(xiàn)不是很有效率,因?yàn)樗鼘D像保存到一個(gè)臨時(shí)文件,然后調(diào)用外部工具(比如系統(tǒng)的默認(rèn)圖片查看軟件)顯示圖像。該函數(shù)將是一個(gè)非常方便的調(diào)試和測(cè)試工具。)
接下來的部分展示了該庫提供的不同功能。
PIL支持多種圖像格式。從磁盤中讀取文件,只需使用 Image 模塊中的 open 函數(shù)。不需要提供文件的圖像格式。PIL庫將根據(jù)文件內(nèi)容自動(dòng)檢測(cè)。
如果要保存到文件,使用 Image 模塊中的 save 函數(shù)。當(dāng)保存文件時(shí),文件名很重要,除非指定格式,否則PIL庫將根據(jù)文件的擴(kuò)展名來決定使用哪種格式保存。
** 轉(zhuǎn)換文件到JPEG **
save 函數(shù)的第二個(gè)參數(shù)可以指定使用的文件格式。如果文件名中使用了一個(gè)非標(biāo)準(zhǔn)的擴(kuò)展名,則必須通過第二個(gè)參數(shù)來指定文件格式。
** 創(chuàng)建JPEG縮略圖 **
需要注意的是,PIL只有在需要的時(shí)候才加載像素?cái)?shù)據(jù)。當(dāng)你打開一個(gè)文件時(shí),PIL只是讀取文件頭獲得文件格式、圖像模式、圖像大小等屬性,而像素?cái)?shù)據(jù)只有在需要的時(shí)候才會(huì)加載。
這意味著打開一個(gè)圖像文件是一個(gè)非??斓牟僮?,不會(huì)受文件大小和壓縮算法類型的影響。
** 獲得圖像信息 **
Image 類提供了某些方法,可以操作圖像的子區(qū)域。提取圖像的某個(gè)子區(qū)域,使用 crop() 函數(shù)。
** 復(fù)制圖像的子區(qū)域 **
定義區(qū)域使用一個(gè)包含4個(gè)元素的元組,(left, upper, right, lower)。坐標(biāo)原點(diǎn)位于左上角。上面的例子提取的子區(qū)域包含300x300個(gè)像素。
該區(qū)域可以做接下來的處理然后再粘貼回去。
** 處理子區(qū)域然后粘貼回去 **
當(dāng)往回粘貼時(shí),區(qū)域的大小必須和參數(shù)匹配。另外區(qū)域不能超出圖像的邊界。然而原圖像和區(qū)域的顏色模式無需匹配。區(qū)域會(huì)自動(dòng)轉(zhuǎn)換。
** 滾動(dòng)圖像 **
paste() 函數(shù)有個(gè)可選參數(shù),接受一個(gè)掩碼圖像。掩碼中255表示指定位置為不透明,0表示粘貼的圖像完全透明,中間的值表示不同級(jí)別的透明度。
PIL允許分別操作多通道圖像的每個(gè)通道,比如RGB圖像。 split() 函數(shù)創(chuàng)建一個(gè)圖像集合,每個(gè)圖像包含一個(gè)通道。 merge() 函數(shù)接受一個(gè)顏色模式和一個(gè)圖像元組,然后將它們合并為一個(gè)新的圖像。接下來的例子交換了一個(gè)RGB圖像的三個(gè)通道。
** 分離和合并圖像通道 **
對(duì)于單通道圖像, split() 函數(shù)返回圖像本身。如果想處理各個(gè)顏色通道,你可能需要先將圖像轉(zhuǎn)為RGB模式。
resize() 函數(shù)接受一個(gè)元組,指定圖像的新大小。
rotate() 函數(shù)接受一個(gè)角度值,逆時(shí)針旋轉(zhuǎn)。
** 基本幾何變換 **
圖像旋轉(zhuǎn)90度也可以使用 transpose() 函數(shù)。 transpose() 函數(shù)也可以水平或垂直翻轉(zhuǎn)圖像。
** transpose **
transpose() 和 rotate() 函數(shù)在性能和結(jié)果上沒有區(qū)別。
更通用的圖像變換函數(shù)為 transform() 。
PIL可以轉(zhuǎn)換圖像的像素模式。
** 轉(zhuǎn)換顏色模式 **
PIL庫支持從其他模式轉(zhuǎn)為“L”或“RGB”模式,其他模式之間轉(zhuǎn)換,則需要使用一個(gè)中間圖像,通常是“RGB”圖像。
ImageFilter 模塊包含多個(gè)預(yù)定義的圖像增強(qiáng)過濾器用于 filter() 函數(shù)。
** 應(yīng)用過濾器 **
point() 函數(shù)用于操作圖像的像素值。該函數(shù)通常需要傳入一個(gè)函數(shù)對(duì)象,用于操作圖像的每個(gè)像素:
** 應(yīng)用點(diǎn)操作 **
使用以上技術(shù)可以快速地對(duì)圖像像素應(yīng)用任何簡(jiǎn)單的表達(dá)式??梢越Y(jié)合 point() 函數(shù)和 paste 函數(shù)修改圖像。
** 處理圖像的各個(gè)通道 **
注意用于創(chuàng)建掩碼圖像的語法:
Python計(jì)算邏輯表達(dá)式采用短路方式,即:如果and運(yùn)算符左側(cè)為false,就不再計(jì)算and右側(cè)的表達(dá)式,而且返回結(jié)果是表達(dá)式的結(jié)果。比如 a and b 如果a為false則返回a,如果a為true則返回b,詳見Python語法。
對(duì)于更多高級(jí)的圖像增強(qiáng)功能,可以使用 ImageEnhance 模塊中的類。
可以調(diào)整圖像對(duì)比度、亮度、色彩平衡、銳度等。
** 增強(qiáng)圖像 **
PIL庫包含對(duì)圖像序列(動(dòng)畫格式)的基本支持。支持的序列格式包括 FLI/FLC 、 GIF 和一些實(shí)驗(yàn)性的格式。 TIFF 文件也可以包含多個(gè)幀。
當(dāng)打開一個(gè)序列文件時(shí),PIL庫自動(dòng)加載第一幀。你可以使用 seek() 函數(shù) tell() 函數(shù)在不同幀之間移動(dòng)。
** 讀取序列 **
如例子中展示的,當(dāng)序列到達(dá)結(jié)尾時(shí),將拋出EOFError異常。
注意當(dāng)前版本的庫中多數(shù)底層驅(qū)動(dòng)只允許seek到下一幀。如果想回到前面的幀,只能重新打開圖像。
以下迭代器類允許在for語句中循環(huán)遍歷序列:
** 一個(gè)序列迭代器類 **
PIL庫包含一些函數(shù)用于將圖像、文本打印到Postscript打印機(jī)。以下是一個(gè)簡(jiǎn)單的例子。
** 打印到Postscript **
如前所述,可以使用 open() 函數(shù)打開圖像文件,通常傳入一個(gè)文件名作為參數(shù):
如果打開成功,返回一個(gè)Image對(duì)象,否則拋出IOError異常。
也可以使用一個(gè)file-like object代替文件名(暫可以理解為文件句柄)。該對(duì)象必須實(shí)現(xiàn)read,seek,tell函數(shù),必須以二進(jìn)制模式打開。
** 從文件句柄打開圖像 **
如果從字符串?dāng)?shù)據(jù)中讀取圖像,使用StringIO類:
** 從字符串中讀取 **
如果圖像文件內(nèi)嵌在一個(gè)大文件里,比如 tar 文件中??梢允褂肅ontainerIO或TarIO模塊來訪問。
** 從tar文檔中讀取 **
** 該小節(jié)不太理解,請(qǐng)參考原文 **
有些解碼器允許當(dāng)讀取文件時(shí)操作圖像。通常用于在創(chuàng)建縮略圖時(shí)加速解碼(當(dāng)速度比質(zhì)量重要時(shí))和輸出一個(gè)灰度圖到激光打印機(jī)時(shí)。
draft() 函數(shù)。
** Reading in draft mode **
輸出類似以下內(nèi)容:
注意結(jié)果圖像可能不會(huì)和請(qǐng)求的模式和大小匹配。如果要確保圖像不大于指定的大小,請(qǐng)使用 thumbnail 函數(shù)。
Python2.7 教程 PIL
Python 之 使用 PIL 庫做圖像處理
來自
1. 簡(jiǎn)介。
圖像處理是一門應(yīng)用非常廣的技術(shù),而擁有非常豐富第三方擴(kuò)展庫的 Python 當(dāng)然不會(huì)錯(cuò)過這一門盛宴。PIL (Python Imaging Library)是 Python 中最常用的圖像處理庫,目前版本為 1.1.7,我們可以?在這里?下載學(xué)習(xí)和查找資料。
Image 類是 PIL 庫中一個(gè)非常重要的類,通過這個(gè)類來創(chuàng)建實(shí)例可以有直接載入圖像文件,讀取處理過的圖像和通過抓取的方法得到的圖像這三種方法。
2. 使用。
導(dǎo)入 Image 模塊。然后通過 Image 類中的 open 方法即可載入一個(gè)圖像文件。如果載入文件失敗,則會(huì)引起一個(gè) IOError ;若無返回錯(cuò)誤,則 open 函數(shù)返回一個(gè) Image 對(duì)象?,F(xiàn)在,我們可以通過一些對(duì)象屬性來檢查文件內(nèi)容,即:
1 import Image
2 ? im = Image.open("j.jpg")
3 ? print im.format, im.size, im.mode
4 JPEG (440, 330) RGB
這里有三個(gè)屬性,我們逐一了解。
format : 識(shí)別圖像的源格式,如果該文件不是從文件中讀取的,則被置為 None 值。
size : 返回的一個(gè)元組,有兩個(gè)元素,其值為象素意義上的寬和高。
mode : RGB(true color image),此外還有,L(luminance),CMTK(pre-press image)。
現(xiàn)在,我們可以使用一些在 Image 類中定義的方法來操作已讀取的圖像實(shí)例。比如,顯示最新載入的圖像:
1 im.show()
2 ?
輸出原圖:
3. 函數(shù)概貌。
3.1 ? ?Reading and Writing Images : open( infilename ) , save( outfilename )
3.2 ? ?Cutting and Pasting and Merging Images :
crop() : 從圖像中提取出某個(gè)矩形大小的圖像。它接收一個(gè)四元素的元組作為參數(shù),各元素為(left, upper, right, lower),坐標(biāo)系統(tǒng)的原點(diǎn)(0, 0)是左上角。
paste() :
merge() :
1 box = (100, 100, 200, 200)
2 ? region = im.crop(box)
3 ? region.show()
4 ? region = region.transpose(Image.ROTATE_180)
5 ? region.show()
6 ? im.paste(region, box)
7 ? im.show()
其效果圖為:
旋轉(zhuǎn)一幅圖片:
1 def roll(image, delta):
2 ?? ?"Roll an image sideways"
3
4 ?? ?xsize, ysize = image.size
5
6 ?? ?delta = delta % xsize
7 ?? ?if delta == 0: return image
8
9 ?? ?part1 = image.crop((0, 0, delta, ysize))
10 ?? ?part2 = image.crop((delta, 0, xsize, ysize))
11 ?? ?image.paste(part2, (0, 0, xsize-delta, ysize))
12 ?? ?image.paste(part1, (xsize-delta, 0, xsize, ysize))
13
14 ?? ?return image
3.3 ? ?幾何變換。
3.3.1 ? ?簡(jiǎn)單的幾何變換。
1 out = im.resize((128, 128)) ? ? ? ? ? ? ? ? ? ? #
2 ?out = im.rotate(45) ? ? ? ? ? ? ? ? ? ? ? ? ? ??#逆時(shí)針旋轉(zhuǎn) 45 度角。
3 ?out = im.transpose(Image.FLIP_LEFT_RIGHT) ? ? ? #左右對(duì)換。
4 ?out = im.transpose(Image.FLIP_TOP_BOTTOM) ? ? ? #上下對(duì)換。
5 ?out = im.transpose(Image.ROTATE_90) ? ? ? ? ? ? #旋轉(zhuǎn) 90 度角。
6 ?out = im.transpose(Image.ROTATE_180) ? ? ? ? ? ?#旋轉(zhuǎn) 180 度角。
7 out = im.transpose(Image.ROTATE_270) ? ? ? ? ? ?#旋轉(zhuǎn) 270 度角。
各個(gè)調(diào)整之后的圖像為:
圖片1:
圖片2:
圖片3:
圖片4:
3.3.2 ? ?色彩空間變換。
convert() : 該函數(shù)可以用來將圖像轉(zhuǎn)換為不同色彩模式。
3.3.3 ? ?圖像增強(qiáng)。
Filters : 在 ImageFilter 模塊中可以使用 filter 函數(shù)來使用模塊中一系列預(yù)定義的增強(qiáng)濾鏡。
1 import ImageFilter
2 imfilter = im.filter(ImageFilter.DETAIL)
3 imfilter.show()
3.4 ? ?序列圖像。
即我們常見到的動(dòng)態(tài)圖,最常見的后綴為 .gif ,另外還有 FLI / FLC 。PIL 庫對(duì)這種動(dòng)畫格式圖也提供了一些基本的支持。當(dāng)我們打開這類圖像文件時(shí),PIL 自動(dòng)載入圖像的第一幀。我們可以使用 seek 和 tell 方法在各幀之間移動(dòng)。
1 import Image
2 im.seek(1) ? ? ? ?# skip to the second frame
3
4 try:
5 ?? ?while 1:
6 ?? ? ? ?im.seek( im.tell() + 1)
7 ?? ? ? ?# do something to im
8 except EOFError:
9 ?? ?pass
3.5 ? ?更多關(guān)于圖像文件的讀取。
最基本的方式:im = Image.open("filename")
類文件讀?。篺p = open("filename", "rb"); im = Image.open(fp)
字符串?dāng)?shù)據(jù)讀取:import StringIO; im = Image.open(StringIO.StringIO(buffer))
從歸檔文件讀?。篿mport TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)
基本的 PIL 目前就練習(xí)到這里。其他函數(shù)的功能可點(diǎn)擊?這里?進(jìn)一步閱讀。
box?=?(100,?100,?400,?400)
region?=?im.crop(box)
區(qū)域由一個(gè)4元組定義,表示為坐標(biāo)是 (left, upper, right, lower)。 Python Imaging Library 使用左上角為 (0, 0)的坐標(biāo)系統(tǒng)。同時(shí)要注意,這些坐標(biāo)指向像素之間的位置,因此上述例子中描述的區(qū)域的大小為300x300像素。
后兩個(gè)數(shù)字需要比前兩個(gè)大
本文是接上一篇 ??【Python從入門到精通】(二十六)用Python的PIL庫(Pillow)處理圖像真的得心應(yīng)手?? 進(jìn)一步介紹Pillow庫的使用, 本文將重點(diǎn)介紹一些高級(jí)特性:比如如何利用Pillow畫圖形(圓形,正方形),介紹通過Pillow庫給圖片添加水??;同時(shí)對(duì)上一篇文章未介紹的常用知識(shí)點(diǎn)進(jìn)行補(bǔ)充說明。希望對(duì)讀者朋友們有所幫助。
上一篇文章已經(jīng)介紹了Image模塊,但是介紹的還不夠全面,例如如何從網(wǎng)頁中讀取圖片沒有介紹到,如何裁剪圖片都沒有介紹到。
讀取網(wǎng)頁中的圖片的基本實(shí)現(xiàn)方式是:首先利用requests庫讀取當(dāng)前圖片鏈接的內(nèi)容,接著將內(nèi)容轉(zhuǎn)成二進(jìn)制數(shù)據(jù),在通過open方法將該二進(jìn)制數(shù)據(jù),最后通過save方法進(jìn)行保存。
讀取結(jié)果是:
通過crop方法可以從圖片中裁剪出一個(gè)指定大小的區(qū)域。裁取的區(qū)域范圍是 (left, upper, right, lower) 比如從某個(gè)寬高都是400的圖片中裁剪一個(gè)是寬高都是100的正方形區(qū)域,只需要指定裁剪區(qū)域的坐標(biāo)是: (0, 0, 100, 100)
有裁剪還有一個(gè)方法就是重新設(shè)置圖片大小的方法 resize,比如將前面400 400的圖片 修改成 300 200,只需要調(diào)用resize方法
通過 convert方法進(jìn)行圖片模式的轉(zhuǎn)換
前面介紹的ImageDraw庫,只是介紹了利用它來向圖片寫入文本,其實(shí)ImageDraw模塊還有一個(gè)更有用的途徑,就是可以通過它來畫各種圖形。
首先創(chuàng)建一個(gè)600*600的畫布。然后再畫布中畫出一個(gè)正方形,畫直線的方法是 line方法。
ImageDraw.line(xy, fill=None, width=0, joint=None)
在xy的坐標(biāo)之間畫一條直線
xy-- 在兩個(gè)坐標(biāo)點(diǎn)之間畫一條直線,坐標(biāo)點(diǎn)的傳入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
fill-- 直線的顏色
width-- 直線的寬度
畫一個(gè)邊框?qū)挾葹?px,顏色為藍(lán)色的,面積為400*400的正方形。
ImageDraw.arc(xy, start, end, fill=None, width=0)
在給定的區(qū)域范圍內(nèi),從開始角到結(jié)束角之間繪制一條圓弧
xy-- 定義邊界框的兩個(gè)點(diǎn),傳入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1=x0,y1=y0
start -- 起始角度,以度為單位,從3點(diǎn)鐘開始順時(shí)針增加
end-- 結(jié)束角度,以度為單位
fill-- 弧線的顏色
width--弧線的寬度
這里就是畫了一個(gè)半圓,如果結(jié)束角度是360度的話則就會(huì)畫一個(gè)完整的圓。
畫圓通過ImageDraw.ellipse(xy, fill=None, outline=None, width=1) 方法,該方法可以畫出一個(gè)給定范圍的圓
xy-- 定義邊界框的兩個(gè)點(diǎn),傳入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1=x0,y1=y0
outline-- 輪廓的顏色
fill --- 填充顏色
width-- 輪廓的寬度
ImageDraw.chord(xy, start, end, fill=None, outline=None, width=1) 方法用來畫半圓,跟arc()方法不同的是它會(huì)用直線將起始點(diǎn)和結(jié)束點(diǎn)連接起來
xy-- 定義邊界框的兩個(gè)點(diǎn),傳入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1=x0,y1=y0
outline-- 輪廓的顏色
fill --- 填充顏色
width-- 輪廓的寬度
ImageDraw.pieslice(xy, start, end, fill=None, outline=None, width=1)
類似于arc()方法,不過他會(huì)在端點(diǎn)和圓點(diǎn)之間畫直線
xy-- 定義邊界框的兩個(gè)點(diǎn),傳入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1=x0,y1=y0
start -- 起始角度,以度為單位,從3點(diǎn)鐘開始順時(shí)針增加
end-- 結(jié)束角度,以度為單位
fill-- 弧線的顏色
width--弧線的寬度
ImageDraw.rectangle(xy, fill=None, outline=None, width=1)
xy-- 在兩個(gè)坐標(biāo)點(diǎn)之間畫一條直線,坐標(biāo)點(diǎn)的傳入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
outline-- 輪廓的顏色
fill-- 填充的顏色
width-- 輪廓線的寬度
ImageDraw.rounded_rectangle(xy, radius=0, fill=None, outline=None, width=1) 該方法可以畫一個(gè)圓角矩形
xy-- 在兩個(gè)坐標(biāo)點(diǎn)之間畫一條直線,坐標(biāo)點(diǎn)的傳入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...]
radius-- 角的半徑
outline-- 輪廓的顏色
fill-- 填充的顏色
width-- 輪廓線的寬度
這里有個(gè)問題,就是畫好的圖形如何從Image中扣出來呢?
ImageEnhance模塊主要是用于設(shè)置圖片的顏色對(duì)比度亮度銳度等啥的,增強(qiáng)圖像。
原始圖像
ImageFilter模塊主要用于對(duì)圖像進(jìn)行過濾,增強(qiáng)邊緣,模糊處理,該模塊的使用方式是 im.filter(ImageFilter) 。
其中ImageFilter按照需求傳入指定的過濾值。
下面一個(gè)個(gè)試下效果
4.邊緣增強(qiáng)
ImageGrab模塊主要用于對(duì)屏幕進(jìn)行截圖,通過grab方法進(jìn)行截取,如果不傳入任何參數(shù)則表示全屏幕截圖,否則是截取指定區(qū)域的圖像。其中box格式是:(x1,x2,y1,y2)
利用Pillow庫可以輕易的對(duì)圖像增加水印
首先,用PIL的Image函數(shù)讀取圖片
接著,新建一張圖(尺寸和原圖一樣)
然后,在新建的圖象上用PIL的ImageDraw把字給畫上去,字的顏色從原圖處獲取。
原圖
添加文字后的效果圖
本文詳細(xì)介紹了Pillow庫的使用,希望對(duì)讀者朋友們有所幫助。
Pillow官方文檔
需要獲取源碼的小伙伴可以關(guān)注下方的公眾號(hào),回復(fù)【python】
網(wǎng)頁題目:crop函數(shù)Python crop函數(shù)
分享路徑:http://jinyejixie.com/article0/dopceoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、品牌網(wǎng)站制作、域名注冊(cè)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)