Pillow是Python里的圖像處理庫(kù)(PIL:Python Image Library),提供了了廣泛的文件格式支持,強(qiáng)大的圖像處理能力,主要包括圖像儲(chǔ)存、圖像顯示、格式轉(zhuǎn)換以及基本的圖像處理操作等。

創(chuàng)新互聯(lián)公司主打移動(dòng)網(wǎng)站、網(wǎng)站制作、做網(wǎng)站、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、域名申請(qǐng)、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
1)使用 Image 類
PIL最重要的類是 Image class, 你可以通過多種方法創(chuàng)建這個(gè)類的實(shí)例;你可以從文件加載圖像,或者處理其他圖像, 或者從 scratch 創(chuàng)建。
要從文件加載圖像,可以使用open( )函數(shù),在Image模塊中:
1
2
from PIL import Image
im = Image.open("E:/photoshop/1.jpg")
加載成功后,將返回一個(gè)Image對(duì)象,可以通過使用示例屬性查看文件內(nèi)容:
1
2
3
print(im.format, im.size, im.mode)
('JPEG', (600, 351), 'RGB')
format 這個(gè)屬性標(biāo)識(shí)了圖像來源。如果圖像不是從文件讀取它的值就是None。size屬性是一個(gè)二元tuple,包含width和height(寬度和高度,單位都是px)。 mode 屬性定義了圖像bands的數(shù)量和名稱,以及像素類型和深度。常見的modes 有 “L” (luminance) 表示灰度圖像, “RGB” 表示真彩色圖像, and “CMYK” 表示出版圖像。
如果文件打開錯(cuò)誤,返回 IOError 錯(cuò)誤。
只要你有了 Image 類的實(shí)例,你就可以通過類的方法處理圖像。比如,下列方法可以顯示圖像:
1
im.show()
2)讀寫圖像
PIL 模塊支持大量圖片格式。使用在 Image 模塊的 open() 函數(shù)從磁盤讀取文件。你不需要知道文件格式就能打開它,這個(gè)庫(kù)能夠根據(jù)文件內(nèi)容自動(dòng)確定文件格式。要保存文件,使用 Image 類的 save() 方法。保存文件的時(shí)候文件名變得重要了。除非你指定格式,否則這個(gè)庫(kù)將會(huì)以文件名的擴(kuò)展名作為格式保存。
加載文件,并轉(zhuǎn)化為png格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
"Python Image Library Test"
from PIL import Image
import os
import sys
for infile in sys.argv[1:]:
f,e = os.path.splitext(infile)
outfile = f +".png"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("Cannot convert", infile)
save() 方法的第二個(gè)參數(shù)可以指定文件格式。
3)創(chuàng)建縮略圖
縮略圖是網(wǎng)絡(luò)開發(fā)或圖像軟件預(yù)覽常用的一種基本技術(shù),使用Python的Pillow圖像庫(kù)可以很方便的建立縮略圖,如下:
1
2
3
4
5
6
7
# create thumbnail
size = (128,128)
for infile in glob.glob("E:/photoshop/*.jpg"):
f, ext = os.path.splitext(infile)
img = Image.open(infile)
img.thumbnail(size,Image.ANTIALIAS)
img.save(f+".thumbnail","JPEG")
上段代碼對(duì)photoshop下的jpg圖像文件全部創(chuàng)建縮略圖,并保存,glob模塊是一種智能化的文件名匹配技術(shù),在批圖像處理中經(jīng)常會(huì)用到。
注意:Pillow庫(kù)不會(huì)直接解碼或者加載圖像柵格數(shù)據(jù)。當(dāng)你打開一個(gè)文件,只會(huì)讀取文件頭信息用來確定格式,顏色模式,大小等等,文件的剩余部分不會(huì)主動(dòng)處理。這意味著打開一個(gè)圖像文件的操作十分快速,跟圖片大小和壓縮方式無關(guān)。
4)圖像的剪切、粘貼與合并操作
Image 類包含的方法允許你操作圖像部分選區(qū),PIL.Image.Image.crop 方法獲取圖像的一個(gè)子矩形選區(qū),如:
1
2
3
4
# crop, paste and merge
im = Image.open("E:/photoshop/lena.jpg")
box = (100,100,300,300)
region = im.crop(box)
矩形選區(qū)有一個(gè)4元元組定義,分別表示左、上、右、下的坐標(biāo)。這個(gè)庫(kù)以左上角為坐標(biāo)原點(diǎn),單位是px,所以上訴代碼復(fù)制了一個(gè) 200×200 pixels 的矩形選區(qū)。這個(gè)選區(qū)現(xiàn)在可以被處理并且粘貼到原圖。
1
2
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
當(dāng)你粘貼矩形選區(qū)的時(shí)候必須保證尺寸一致。此外,矩形選區(qū)不能在圖像外。然而你不必保證矩形選區(qū)和原圖的顏色模式一致,因?yàn)榫匦芜x區(qū)會(huì)被自動(dòng)轉(zhuǎn)換顏色。
5)分離和合并顏色通道
對(duì)于多通道圖像,有時(shí)候在處理時(shí)希望能夠分別對(duì)每個(gè)通道處理,處理完成后重新合成多通道,在Pillow中,很簡(jiǎn)單,如下:
1
2
r,g,b = im.split()
im = Image.merge("RGB", (r,g,b))
對(duì)于split( )函數(shù),如果是單通道的,則返回其本身,否則,返回各個(gè)通道。
6)幾何變換
對(duì)圖像進(jìn)行幾何變換是一種基本處理,在Pillow中包括resize( )和rotate( ),如用法如下:
1
2
out = im.resize((128,128))
out = im.rotate(45) # degree conter-clockwise
其中,resize( )函數(shù)的參數(shù)是一個(gè)新圖像大小的元祖,而rotate( )則需要輸入順時(shí)針的旋轉(zhuǎn)角度。在Pillow中,對(duì)于一些常見的旋轉(zhuǎn)作了專門的定義:
1
2
3
4
5
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
7)顏色空間變換
在處理圖像時(shí),根據(jù)需要進(jìn)行顏色空間的轉(zhuǎn)換,如將彩色轉(zhuǎn)換為灰度:
1
2
cmyk = im.convert("CMYK")
gray = im.convert("L")
8)圖像濾波
例如:在C:\TDDOWNLOAD目錄下有a.txt、b.txt兩個(gè)文件,另有\(zhòng)sub1子文件夾,C:\TDDOWNLOAD\sub1下又有c.txt、d.txt兩個(gè)文件。 1. os.walk os.walk()返回一個(gè)三元素的tuple:當(dāng)前路徑、子文件夾名稱、文件列表。 import os def fun( path ):... for root, dirs, files in os.walk( path ):... for fn in files:... print root, fn... fun( r'C:\TDDOWNLOAD' )C:\TDDOWNLOAD a.txtC:\TDDOWNLOAD b.txtC:\TDDOWNLOAD\sub1 c.txtC:\TDDOWNLOAD\sub1 d.txt 2. glob.glob glob.glob()只接受一個(gè)參數(shù),這個(gè)參數(shù)既代有路徑,又代有匹配模式,返回值為一個(gè)列表。注意,glob.glob()無法直接穿透子文件夾,需要自己處理: def fun( path ):... for fn in glob.glob( path + os.sep + '*' ): # '*'代表匹配所有文件... if os.path.isdir( fn ): # 如果結(jié)果為文件夾... fun( fn ) # 遞歸... else:... print fn... fun( r'C:\TDDOWNLOAD' )C:\TDDOWNLOAD\a.txtC:\TDDOWNLOAD\b.txtC:\TDDOWNLOAD\sub1\c.txtC:\TDDOWNLOAD\sub1\d.txt '*'為匹配模式,代表匹配所有文件,只有這樣才能將子文件夾查出來,以便遞歸深入,探查下一層的文件。
使用路徑對(duì)象glob()函數(shù)和rglob()函數(shù),可以查看指定路徑下的文件和子文件夾,兩者的區(qū)別在于,glob()函數(shù)只進(jìn)行一級(jí)查找,而rglob()函數(shù)會(huì)進(jìn)行多級(jí)查找。
from pathlib import Path
p = Path('d:\\文件夾\\')
r = p.glob('*')
for i in r:
print(i) #顯示glob()函數(shù)的結(jié)果
print('-' * 25) #這里是分割線
r = p.rglob('*')
for i in r:
print(i)#顯示rglob()函數(shù)的結(jié)果
查看對(duì)應(yīng)結(jié)果如下:
d:\11\11.txt
d:\11\r.mp3
d:\11\t.mp3
d:\11\tp1000
d:\11\文件夾
-------------------------
d:\11\11.txt
d:\11\r.mp3
d:\11\t.mp3
d:\11\tp1000
d:\11\文件夾
d:\11\文件夾\文檔.txt
________________END______________
import re,os
import sys
def filelist(path,r,f):
"""
function to find the directions and files in the given direction
according to your parameters,fileonly or not,recursively find or not.
"""
file_list = []
os.chdir(path)
filename = os.listdir(path)
if len(filename) == 0:
os.chdir(os.pardir)
return filename
if r == 1: ##
if f == 0: # r = 1, recursively find directions and files. r = 0 otherwise.
for name in filename: # f = 1, find files only, f = 0,otherwise.
if os.path.isdir(name): ##
file_list.append(name)
name = os.path.abspath(name)
subfile_list = filelist(name,r,f)
for n in range(len(subfile_list)):
subfile_list[n] = '\t'+subfile_list[n]
file_list += subfile_list
else:
file_list.append(name)
os.chdir(os.pardir)
return file_list
elif f == 1:
for name in filename:
if os.path.isdir(name):
name = os.path.abspath(name)
subfile_list = filelist(name,r,f)
for n in range(len(subfile_list)):
subfile_list[n] = '\t'+subfile_list[n]
file_list += subfile_list
else:
file_list.append(name)
os.chdir(os.pardir)
return file_list
else:
print 'Error1'
elif r == 0:
if f == 0:
os.chdir(os.pardir)
return filename
elif f == 1:
for name in filename:
if os.path.isfile(name):
file_list.append(name)
os.chdir(os.pardir)
return file_list
else:
print 'Error2'
else:
print 'Error3'
'''
f = 0:list all the files and folders
f = 1:list files only
r = 1:list files or folders recursively,all the files and folders in the current direction and subdirection
r = 0:only list files or folders in the current direction,not recursively
as for RE to match certern file or dirction,you can write yourself, it is easier than the function above.Just use RE to match the result,if match,print;else,pass
"""
#this python file is used to read SAC file
import os
import sys
import subprocess
import glob
from obspy.core import read
from PyQt5.QtWidgetsimport *
from PyQt5.QtGuiimport *
from PyQt5.QtCoreimport *
from PyQt5import QtCore, QtGui, QtWidgets
'''import os 是導(dǎo)入標(biāo)準(zhǔn)庫(kù)os,利用其中的API。
sys模塊包含了與Python解釋器和它的環(huán)境有關(guān)的函數(shù)。
glob是python自帶的一個(gè)文件操作模塊,用它查找符合目的的文件,類似于Windows下的文件搜索,支持通配符操作
subprocess允許創(chuàng)建一個(gè)新的進(jìn)程讓其執(zhí)行另外的程序,并與它進(jìn)行通信,獲取標(biāo)準(zhǔn)的輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤以及返回碼等
'''
def run(path):
# path = QtWidgets.QFileDialog.getExistingDirectory(None, "Select File Directory to Save File", "")
fileName = os.listdir(path)
os.chdir(path)
os.putenv("SAC_DISPLAY_COPYRIGHT", '0')
for namein fileName:
# name = i
#for file in glob.glob("*.SAC"):
#glob.glob是匹配所有符合條件的文件,并將其以list的形式返回
#os.putenv("SAC_DISPLAY_COPYRIGHT", '0') #os.putenv(‘環(huán)境變量名稱’, ‘環(huán)境變量值’)
#p = subprocess.Popen(['sac'], stdin=subprocess.PIPE)#Popen表示調(diào)用sac
#stdin指向鍵盤輸入,standard input
#Python 3 利用 subprocess 實(shí)現(xiàn)管道( pipe )交互操作讀/寫通信
# s = "r " + name + " \n"? ###這里應(yīng)該是傳入某個(gè)文件,所以應(yīng)該有個(gè)讀取文件的按鈕
# s += "qdp off\n"
# s += "ch allt (0 - 1,o) iztype IO \n"? #修改發(fā)震時(shí)刻為零
# s += "rmean; rtrend; taper \n"? #去均值,去線性趨勢(shì),去尖滅
# s += "bp c 0.05 10 n 4 p 2 \n"? #帶通濾波
# s += "w over\n"
# s += "r *BHN *BHE \n"? #分量旋轉(zhuǎn),讀入N、E分量,rot并修改頭段變量
# s += "rotate to gcp"
# s += "w .BHR .BHT"
# s += "r *.BHR\n"
# s += "ch KCMPNM BHR\n"
# s += "w over\n"
# s += "r *.BHT\n"
# s += "ch KCMPNM BHT\n"
# s += "w over\n"
# s += "p \n"
# s += "saveimg 2009.ps\n"
# s += "q\n"
? ? s ="r " + name +" \n"
? ? #s += "ppk p 3 a m\n"
? ? s +="w over\n"
? ? s +="q \n"
? ? # p.communicate(s.encode()) #通過p.communicate() 將命令s.encode() 傳遞給sac,實(shí)現(xiàn)sac的操作
? ? subprocess.Popen(['sac'], stdin=subprocess.PIPE).communicate(s.encode())
5個(gè)常用的Python標(biāo)準(zhǔn)庫(kù):
1、os:提供了不少與操作系統(tǒng)相關(guān)聯(lián)的函數(shù)庫(kù)
os包是Python與操作系統(tǒng)的接口。我們可以用os包來實(shí)現(xiàn)操作系統(tǒng)的許多功能,比如管理系統(tǒng)進(jìn)程,改變當(dāng)前路徑,改變文件權(quán)限等。但要注意,os包是建立在操作系統(tǒng)的平臺(tái)上的,許多功能在Windows系統(tǒng)上是無法實(shí)現(xiàn)的。另外,在使用os包中,要注意其中的有些功能已經(jīng)被其他的包取代。
我們通過文件系統(tǒng)來管理磁盤上儲(chǔ)存的文件。查找、刪除、復(fù)制文件以及列出文件列表等都是常見的文件操作。這些功能通常可以在操作系統(tǒng)中看到,但現(xiàn)在可以通過Python標(biāo)準(zhǔn)庫(kù)中的glob包、shutil包、os.path包以及os包的一些函數(shù)等,在Python內(nèi)部實(shí)現(xiàn)。
2、sys:通常用于命令行參數(shù)的庫(kù)
sys包被用于管理Python自身的運(yùn)行環(huán)境。Python是一個(gè)解釋器,也是一個(gè)運(yùn)行在操作系統(tǒng)上的程序。我們可以用sys包來控制這一程序運(yùn)行的許多參數(shù),比如說Python運(yùn)行所能占據(jù)的內(nèi)存和CPU,Python所要掃描的路徑等。另一個(gè)重要功能是和Python自己的命令行互動(dòng),從命令行讀取命令和參數(shù)。
3、random:用于生成隨機(jī)數(shù)的庫(kù)
Python標(biāo)準(zhǔn)庫(kù)中的random函數(shù),可以生成隨機(jī)浮點(diǎn)數(shù)、整數(shù)、字符串,甚至幫助你隨機(jī)選擇列表序列中的一個(gè)元素,打亂一組數(shù)據(jù)等。
4、math:提供了數(shù)學(xué)常數(shù)和數(shù)學(xué)函數(shù)
標(biāo)準(zhǔn)庫(kù)中,Python定義了一些新的數(shù)字類型,以彌補(bǔ)之前的數(shù)字類型可能的不足。標(biāo)準(zhǔn)庫(kù)還包含了random包,用于處理隨機(jī)數(shù)相關(guān)的功能。math包補(bǔ)充了一些重要的數(shù)學(xué)常數(shù)和數(shù)學(xué)函數(shù),比如pi、三角函數(shù)等等。
5、datetime:日期和時(shí)間的操作庫(kù)
日期和時(shí)間的管理并不復(fù)雜,但容易犯錯(cuò)。Python的標(biāo)準(zhǔn)庫(kù)中對(duì)日期和時(shí)間的管理頗為完善,你不僅可以進(jìn)行日期時(shí)間的查詢和變換,還可以對(duì)日期時(shí)間進(jìn)行運(yùn)算。通過這些標(biāo)準(zhǔn)庫(kù),還可以根據(jù)需要控制日期時(shí)間輸出的文本格式。
除此之外,Python還有很多第三方庫(kù),了解更多可移步:oldboyedu
分享標(biāo)題:glob函數(shù)python glob函數(shù)遍歷目錄
文章URL:http://chinadenli.net/article26/hjocjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、網(wǎng)站制作、網(wǎng)站內(nèi)鏈、標(biāo)簽優(yōu)化、網(wǎng)站設(shè)計(jì)公司
聲明:本網(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)