PIL詳細文檔express
The most important class in the Python Imaging Library is the Image class, defined in the module with the same name. You can create instances of this class in several ways; either by loading images from files, processing other images, or creating images from scratch.
解釋:Python映像庫中最重要的類是Image類,定義在具備相同名稱的模塊中。您能夠經過多種方式建立該類的實例;經過從文件加載圖像,處理其餘圖像,或從頭建立圖像/。數組
一、簡單實用Image函數
從文件加載圖像,用Image函數的open方法
>>> from PIL import Image
>>> im = Image.open("hopper.ppm")less
若是成功,這個函數將返回一個圖像對象。如今您可使用實例屬性來檢查文件內容
>>> from __future__ import print_function
>>> print(im.format, im.size, im.mode)
PPM (512, 512) RGBide
format屬性識別圖形的源,若圖片不是從文件讀取的將顯示None;
size屬性是一個包含寬度和高度的二元數組(以像素爲單位);
mode屬性定義了圖像中波段的數量和名稱,以及像素類型和深度
save 要保存文件,請使用Image類的save()方法
常見的模式是「L」(亮度)用於灰度圖像,「RGB」用於真正的彩色圖像,以及「CMYK」用於預壓圖像函數
一旦有了Image類的實例,就可使用該類定義的方法來處理和操做圖像
>>> im.show() #顯示剛剛加載的圖像測試
show()的標準版本不是頗有效,由於它將圖像保存到一個臨時文件中,並調用xv實用程序來顯示圖像。若是你沒有安裝xv,它甚至不會工做。可是,當它確實起做用時,它對於調試和測試很是方便。優化
例子:建立圖片的縮略圖
im = Image.open('bossimg.jpg')
print im.format,im.size,im.mode
size = (30,40)
im.thumbnail(size) #大小是元組長和寬
im.save('boss.png','PNG') #以png格式保存縮略圖動畫
二、讀寫圖片ui
1)將文件轉換成JPEG
from __future__ import print_function
import os, sys
from PIL import Imagethis
for infile in sys.argv[1:]:
f, e = os.path.splitext(infile)
outfile = f + ".jpg"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("cannot convert", infile)
2)建立JPEG縮略圖
from __future__ import print_function
import os, sys
from PIL import Image
size = (128, 128)
for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + ".thumbnail"
if infile != outfile:
try:
im = Image.open(infile)
im.thumbnail(size)
im.save(outfile, "JPEG")
except IOError:
print("cannot create thumbnail for", infile)
3)識別圖像文件
from __future__ import print_function
import sys
from PIL import Image
for infile in sys.argv[1:]:
try:
with Image.open(infile) as im:
print(infile, im.format, "%dx%d" % im.size, im.mode)
except IOError:
pass
三、剪切、粘貼和合並圖像
1)從圖像中複製子矩形
box = (100, 100, 400, 400)
region = im.crop(box)
該區域由一個4元組定義,其中座標爲(左、上、右、下)。Python映像庫使用左上角的(0,0)座標系統。還要注意,座標是指像素之間的位置,因此上面例子中的區域正好是300x300像素。
2)處理一個子矩形,並將其粘貼回去
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
當粘貼區域返回時,區域的大小必須與給定區域徹底匹配。此外,該區域不能擴展到圖像以外。然而,原始圖像的模式和區域不須要匹配。若是不這樣作,在粘貼以前,該區域會自動轉換(詳情請參閱下面的顏色轉換部分)。
3)滾動一個圖像
def roll(image, delta):
"Roll an image sideways"
xsize, ysize = image.size
delta = delta % xsize
if delta == 0: return image
part1 = image.crop((0, 0, delta, ysize))
part2 = image.crop((delta, 0, xsize, ysize))
part1.load()
part2.load()
image.paste(part2, (0, 0, xsize-delta, ysize))
image.paste(part1, (xsize-delta, 0, xsize, ysize))
return image
對於更高級的技巧,paste方法還可使用透明掩碼做爲可選參數。在該掩碼中,值255表示粘貼圖像在該位置是不透明的(也就是說,粘貼的圖像應該被使用)。值0表示粘貼的圖像是徹底透明的。中間值表示不一樣級別的透明性。例如,粘貼一個RGBA圖像並使用它做爲掩碼會粘貼圖像的不透明部分,而不是它的透明背景。
4)分裂和合並圖像
r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))
注意,對於單個帶圖像,split()返回圖像自己。要使用單獨的顏色組合,您可能須要先將圖像轉換爲「RGB」。
四、幾何變換
PIL.Image。Image類包含了調整()和旋轉()圖像的方法。前者採用一個元組來給出新的尺寸,後者是逆時針方向的角度。
The PIL.Image.Image class contains methods to resize() and rotate() an image. The former takes a tuple giving the new size, the latter the angle in degrees counter-clockwise.
1)簡單的幾何變換
out = im.resize((128, 128))
out = im.rotate(45) # degrees counter-clockwise
要在90度的步驟中旋轉圖像,您可使用rotate()方法或轉置()方法。後者也能夠用來在水平或垂直軸上翻轉圖像。
To rotate the image in 90 degree steps, you can either use the rotate() method or the transpose() method. The latter can also be used to flip an image around its horizontal or vertical axis.
2)移位一個圖像
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)
一種更通常的圖像轉換能夠經過transform()方法進行。
五、顏色轉換
Python圖像庫容許使用convert()方法在不一樣的像素表示之間轉換圖像
模式之間的轉換
from PIL import Image
im = Image.open("hopper.ppm").convert("L")
庫支持每一個受支持的模式和「L」和「RGB」模式之間的轉換。要在其餘模式之間轉換,您可能須要使用中間圖像(一般是「RGB」圖像)。
六、圖象加強
Python圖像庫提供了許多方法和模塊,可用於加強圖像。
1)過濾
ImageFilter模塊包含許多預先定義的加強過濾器,能夠與filter()方法一塊兒使用
from PIL import ImageFilter
out = im.filter(ImageFilter.DETAIL)
2)點運算
point()方法能夠用來翻譯圖像的像素值(如圖像對比度處理)。在大多數狀況下,指望一個參數的函數對象能夠傳遞給這個方法。每一個像素都是按照該功能進行處理的。
# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)
使用上述技術,您能夠快速地將任何簡單的表達式應用到圖像中。還能夠將point()和paste()方法組合爲有選擇地修改圖像
3)處理單個的圖像頻段
# split the image into individual bands
source = im.split()
R, G, B = 0, 1, 2
# select regions where red is less than 100
mask = source[R].point(lambda i: i < 100 and 255)
# process the green band
out = source[G].point(lambda i: i * 0.7)
# paste the processed band back, but only where red was < 100
source[G].paste(out, None, mask)
# build a new multiband image
im = Image.merge(im.mode, source)
建立掩碼的語法:
imout = im.point(lambda i: expression and 255)
4)加強或者優化處理
Python只計算邏輯表達式的部分,以肯定結果,並返回做爲表達式結果檢查的最後一個值。所以,若是上面的表達式爲false(0),Python就不會查看第二個操做數,所以返回0。不然,它將返回255
from PIL import ImageEnhance
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")
七、圖像序列
Python映像庫包含對圖像序列(也稱爲動畫格式)的一些基本支持。支持的序列格式包括FLI / FLC、GIF和一些實驗格式。TIFF文件也能夠包含多個幀。
當打開一個序列文件時,PIL會自動加載序列中的第一幀。您可使用seek和tell方法在不一樣的幀之間移動
1)讀序列
from PIL import Image
im = Image.open("animation.gif")
im.seek(1) # skip to the second frame
try:
while 1:
im.seek(im.tell()+1)
im.show()
# do something to im
except EOFError:
pass # end of sequence
如本例中所示,當序列結束時,您將獲得一個EOFError異常
下面的類讓您使用for - statement來對序列進行循環
Using the ImageSequence Iterator class
from PIL import ImageSequence
for frame in ImageSequence.Iterator(im):
# ...do something to frame...
八、圖像打印
Python映像庫包括用於在Postscript打印機上打印圖像、文本和圖形的函數
下面是一個簡單的列子簡答說明
from PIL import Image
from PIL import PSDraw
im = Image.open("hopper.ppm")
title = "hopper"
box = (1*72, 2*72, 7*72, 10*72) # in points
ps = PSDraw.PSDraw() # default is sys.stdout
ps.begin_document(title)
# draw the image (75 dpi)
ps.image(box, im, 75)
ps.rectangle(box)
# draw title
ps.setfont("HelveticaNarrow-Bold", 36)
ps.text((3*72, 4*72), title)
ps.end_document()
九、更多的讀取圖像
您可使用相似文件的對象而不是文件名。對象必須實現read()、seek()和tell()方法,並以二進制模式打開。
1)從打開的文件中讀取
from PIL import Image
with open("hopper.ppm", "rb") as fp:
im = Image.open(fp)
2)從字符串閱讀
import StringIO
im = Image.open(StringIO.StringIO(buffer))
注意,在讀取圖像標題以前,庫會對文件進行重卷(使用查找(0))。此外,當讀取圖像數據時,也會使用seek(經過load方法)。若是圖像文件嵌入到一個較大的文件中,好比tar文件,那麼可使用ContainerIO或TarIO模塊來訪問它
3)從tar壓縮文件中讀取
from PIL import Image, TarIO
fp = TarIO.TarIO("Tests/images/hopper.tar", "hopper.jpg")
im = Image.open(fp)
十、控制譯碼器
一些解碼器容許您在讀取文件時對圖像進行操做。在建立縮略圖(一般速度比質量更重要)和打印到單色激光打印機(只須要一個灰度版本的圖像)時,這一般能夠用來加速解碼。
The draft() method manipulates an opened but not yet loaded image so it as closely as possible matches the given mode and size. This is done by reconfiguring the image decoder.
1) 閱讀草稿模式
這隻適用於JPEG和MPO文件
from PIL import Image
from __future__ import print_function
im = Image.open(file)
print("original =", im.mode, im.size)
im.draft("L", (100, 100))
print("draft =", im.mode, im.size)
上述執行打印出相似下面:
original = RGB (512, 512)
draft = L (128, 128)
注意,生成的圖像可能與請求的模式和大小不徹底匹配。爲了確保圖像不大於給定的大小,使用縮略圖方法。