PIL庫

目錄node

1、安裝命令python

2、Image模塊web

3、format類編程

4、Mode類ruby

5、convert類app

6、size類機器學習

​7、Palette類函數

8、Info類學習

 9、new類字體

10、Copy 類

11、Crop類

12、Paste類

十3、Filter類

十4、Blend類

十5、Split

十6、Composite類

​十7、Eval類

 十8、Merge類

十9、Draft類

二10、Getbands類

二11、Getbbox類

​二12、Getdata類

二十3、Getextrema類

二十4、Getpixel類

二十5、Histogram類

二十6、Load類

二十7、Putdata類

二十8、Resize類

二十9、Rotate類

三10、Seek類

三11、Tell類

三12、Thumbnail類

三十3、Transform類

三十4、Transpose類

三十5、ImageDraw

三十6、ImageFont


1、安裝命令

sudo apt-get install python-imaging

2、Image模塊

Image模塊是在Python PIL圖像處理中常見的模塊,對圖像進行基礎操做的功能基本都包含於此模塊內。如open、save、conver、show…等功能。
open類

Image.open(file) ⇒ image
Image.open(file, mode) ⇒ image

要從文件加載圖像,使用 open() 函數, 在 Image 模塊:

@zhangziju

from PIL import Image ##調用庫

im = Image.open("E:\mywife.jpg") ##文件存在的路徑

im.show()

      

                                         

須要知道的是在win的環境下im.show的方式爲win自帶的圖像顯示應用。打開並確認給定的圖像文件。這個是一個懶操做;該函數只會讀文件頭,而真實的圖像數據直到試圖處理該數據纔會從文件讀取(調用load()方法將強行加載圖像數據)。若是變量mode被設置,那必須是「r」。用戶可使用一個字符串(表示文件名稱的字符串)或者文件對象做爲變量file的值。文件對象必須實現read(),seek()和tell()方法,而且以二進制模式打開。
Save類

im.save(outfile,options…)
im.save(outfile, format, options…)

若要保存文件,則使用 Image 類的 save() 方法,此時保存文件的文件名就變得十分重要了,除非指定格式,不然這個庫將會以文件名的擴展名做爲格式保存。使用給定的文件名保存圖像。若是變量format缺省,若是可能的話,則從文件名稱的擴展名判斷文件的格式。該方法返回爲空。關鍵字options爲文件編寫器提供一些額外的指令。若是編寫器不能識別某個選項,它將忽略它。用戶可使用文件對象代替文件名稱。在這種狀況下,用戶必須指定文件格式。文件對象必須實現了seek()、tell()和write()方法,且其以二進制模式打開。若是方法save()由於某些緣由失敗,這個方法將產生一個異常(一般爲IOError異常)。若是發生了異常,該方法也有可能已經建立了文件,並向文件寫入了一些數據。若是須要的話,用戶的應用程序能夠刪除這個不完整的文件。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im)

im.save("E:\mywife.png") ## 將"E:\mywife.jpg"保存爲"E:\mywife.png"

im = Image.open("E:\mywife.png") ##打開新的png圖片

print(im.format, im.size, im.mode)

                           
以下圖,在指定路徑下可看到新保存的png格式的圖片。
                               

3、format類

im.format ⇒ string or None

這個屬性標識了圖像來源,若是圖像不是從文件讀取它的值就是None。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.format) ## 打印出格式信息

im.show()

以下圖能夠看到其format爲」JPEG」。

                    
4、Mode類

im.mode ⇒ string

圖像的模式,常見的mode 有 「L」 (luminance) 表示灰度圖像,「RGB」表示真彩色圖像,和 「CMYK」 表示出版圖像,代表圖像所使用像素格式。如面爲常見的nodes描述:

  • modes           描述
  • 1                   1位像素,黑和白,存成8位的像素
  • L                   8位像素,黑白
  • P                   8位像素,使用調色板映射到任何其餘模式
  • RGB              3× 8位像素,真彩
  • RGBA           4×8位像素,真彩+透明通道
  • CMYK           4×8位像素,顏色隔離
  • YCbCr           3×8位像素,彩色視頻格式
  • I                     32位整型像素
  • F                    32位浮點型像素
@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.mode) ## 打印出模式信息

im.show()

以下圖爲圖片的mode爲「RGB」模式。

                          
5、convert類

im.convert(mode)⇒ image

將當前圖像轉換爲其餘模式,而且返回新的圖像。當從一個調色板圖像轉換時,這個方法經過這個調色板來轉換像素。若是不對變量mode賦值,該方法將會選擇一種模式,在沒有調色板的狀況下,使得圖像和調色板中的全部信息均可以被表示出來。當從一個顏色圖像轉換爲黑白圖像時,PIL庫使用ITU-R601-2 luma轉換公式:

L = R * 299/1000 + G * 587/1000 + B * 114/1000

當轉換爲2位圖像(模式「1」)時,源圖像首先被轉換爲黑白圖像。結果數據中大於127的值被設置爲白色,其餘的設置爲黑色;這樣圖像會出現抖動。若是要使用其餘閾值,更改閾值127,可使用方法point()。爲了去掉圖像抖動現象,可使用dither選項。
 

from PIL import Image

im = Image.open("E:\mywife.jpg")

new_im = im.convert('P')

print(new_im.mode)

new_im.show()

以下,將圖像轉換爲「P」模式。

                           
對比原始圖像。

im.convert(「P」,**options) ⇒ image

這個與第一個方法定義同樣,可是當「RGB」圖像轉換爲8位調色板圖像時能更好的處理。可供選擇的選項爲:

Dither=. 控制顏色抖動。默認是FLOYDSTEINBERG,與鄰近的像素一塊兒承擔錯誤。不使能該功能,則賦值爲NONE。

Palette=. 控制調色板的產生。默認是WEB,這是標準的216色的「web palette」。要使用優化的調色板,則賦值爲ADAPTIVE。

Colors=. 當選項palette爲ADAPTIVE時,控制用於調色板的顏色數目。默認是最大值,即256種顏色

im.convert(mode,matrix) ⇒ image

使用轉換矩陣將一個「RGB」圖像轉換爲「L」或者「RGB」圖像。變量matrix爲4或者16元組。

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.mode)

rgb2xyz = (0.412453,0.357580, 0.180423, 0,

0.212671,0.715160, 0.072169, 0,

0.019334,0.119193, 0.950227, 0 )

new_im = im.convert("L", rgb2xyz)

print(new_im.mode)

new_im.show()

 

                                       
轉換後效果

        

 

6、size類

im.size ⇒ (width, height)

圖像的尺寸,按照像素數計算,它的返回值爲寬度和高度的二元組(width, height)。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.size) ## 打印出尺寸信息

im.show()

以下圖所示爲圖片的尺寸信息,750*560。

                                 
7、Palette類

im.palette ⇒ palette or None

顏色調色板表格。若是圖像的模式是「P」,則返回ImagePalette類的實例;不然,將爲None。
以下爲對非「P」模式下的圖像進行palette信息顯示。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.palette)

易知,返回值爲空,none

 

                                     
對圖像進行convert操做,轉換成「P」模式

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

new_im = im.convert('P')

print(new_im.mode)

print(new_im.palette)

  則返回值爲ImagePalette類的實例。以下:

      

                             
8、Info類

im.info ⇒ dictionary

存儲圖像相關數據的字典。文件句柄使用該字典傳遞從文件中讀取的各類非圖像信息。大多數方法在返回新的圖像時都會忽略這個字典;由於字典中的鍵並不是標準化的,對於一個方法,它不能知道本身的操做如何影響這個字典。若是用戶須要這些信息,須要在方法open()返回時保存這個字典。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.info)

 
9、new類

Image.new(mode,size) ⇒ image
Image.new(mode, size,color) ⇒ image

使用給定的變量mode和size生成新的圖像。Size是給定的寬/高二元組,這是按照像素數來計算的。對於單通道圖像,變量color只給定一個值;對於多通道圖像,變量color給定一個元組(每一個通道對應一個值)。在版本1.1.4及其以後,用戶也能夠用顏色的名稱,好比給變量color賦值爲「red」。若是沒有對變量color賦值,圖像內容將會被所有賦值爲0(爲黑色)。若是變量color是空,圖像將不會被初始化,即圖像的內容全爲0。這對向該圖像複製或繪製某些內容是有用的。

以下爲將圖像設置爲128x128大小的紅色圖像。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

n_im= Image.new("RGB", (128, 128), "#FF0000")

n_im.show()

顯示效果以下:

                                                                              
以下圖像爲128x128大小的黑色圖像,由於變量color不賦值的話,圖像內容被設置爲0,即黑色。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

n_im= Image.new("RGB", (128, 128))

n_im.show()

                                                 

黑圖像爲128x128大小的綠色圖像。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

n_im= Image.new("RGB", (128, 128),"green")

n_im.show()

 

                                                       
10、Copy 類

im.copy() ⇒ image

拷貝這個圖像。若是用戶想粘貼一些數據到這張圖,可使用這個方法,可是原始圖像不會受到影響。
 

from PIL import Image

im = Image.open("E:\mywife.jpg")

im_copy = im.copy()

圖像im_copy和im徹底同樣。

11、Crop類

im.crop(box) ⇒ image

從當前的圖像中返回一個矩形區域的拷貝。變量box是一個四元組,定義了左、上、右和下的像素座標。用來表示在原始圖像中截取的位置座標,如box(100,100,200,200)就表示在原始圖像中以左上角爲座標原點,截取一個100*100(像素爲單位)的圖像,爲方便理解,以下爲示意圖box(b1,a1,b2,a2)。做圖軟件爲Visio2016。這是一個懶操做。對源圖像的改變可能或者可能不體如今裁減下來的圖像中。爲了獲取一個分離的拷貝,對裁剪的拷貝調用方法load()。

                                            

 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

box = (300, 100, 700, 700) ##肯定拷貝區域大小

region = im.crop(box) ##將im表示的圖片對象拷貝到region中,大小爲box

region.show()

以下圖爲box截取的圖像區域顯示。

    

12、Paste類

    im.paste(image,box)

將一張圖粘貼到另外一張圖像上。變量box或者是一個給定左上角的2元組,或者是定義了左,上,右和下像素座標的4元組,或者爲空(與(0,0)同樣)。若是給定4元組,被粘貼的圖像的尺寸必須與區域尺寸同樣。若是模式不匹配,被粘貼的圖像將被轉換爲當前圖像的模式。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

box=[0,0,100,100]

im_crop = im.crop(box)

print(im_crop.size,im_crop.mode)

im.paste(im_crop, (100,100)) ##(100,100,0,0)

im.paste(im_crop, (400,400,500,500))

im.show()

以下圖爲paste操做:

                
十3、Filter類

im.filter(filter) ⇒ image

返回一個使用給定濾波器處理過的圖像的拷貝。具體參考圖像濾波在ImageFilter 模塊的應用,在該模塊中,預先定義了不少加強濾波器,能夠經過filter( )函數使用,預約義濾波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值濾波,CONTOUR找輪廓,FIND_EDGES邊緣檢測,使用該模塊時,需先導入。

@zhangziju

from PIL import Image

from PIL import ImageFilter ## 調取ImageFilter

imgF = Image.open("E:\mywife.jpg")

bluF = imgF.filter(ImageFilter.BLUR) ##均值濾波

conF = imgF.filter(ImageFilter.CONTOUR) ##找輪廓

edgeF = imgF.filter(ImageFilter.FIND_EDGES) ##邊緣檢測

imgF.show()

bluF.show()

conF.show()

edgeF.show()

 濾波處理

十4、Blend類

Image.blend(image1,image2, alpha) ⇒ image

使用給定的兩張圖像及透明度變量alpha,插值出一張新的圖像。這兩張圖像必須有同樣的尺寸和模式。

合成公式爲:out = image1 (1.0 - alpha) + image2 alpha

若變量alpha爲0.0,返回第一張圖像的拷貝。若變量alpha爲1.0,將返回第二張圖像的拷貝。對變量alpha的值無限制。

@zhangziju

from PIL import Image

im1 = Image.open("E:\mywife.jpg")

im2 = Image.open("E:\mywife2.jpg")

print(im1.mode,im1.size)

print(im2.mode,im2.size)

im = Image.blend(im1, im2, 0.2)

im.show()

需保證兩張圖像的模式和大小是一致的,以下爲顯示im1和im2的具體信息。

                                       
im1和im2按照第一張80%的透明度,第二張20%的透明度,合成爲一張。
 

十5、Split

im.split() ⇒ sequence

返回當前圖像各個通道組成的一個元組。例如,分離一個「RGB」圖像將產生三個新的圖像,分別對應原始圖像的每一個通道(紅,綠,藍)。

from PIL import Image

im = Image.open("E:\mywife.jpg")

r,g,b = im.split()

print(r.mode)

print(r.size)

print(im.size)

十6、Composite類

Image.composite(image1,image2, mask) ⇒ image

複合類使用給定的兩張圖像及mask圖像做爲透明度,插值出一張新的圖像。變量mask圖像的模式能夠爲「1」,「L」或者「RGBA」。全部圖像必須有相同的尺寸。

@zhangziju

from PIL import Image

im1 = Image.open("E:\mywife.jpg")

im2 = Image.open("E:\mywife2.jpg")

r,g,b = im1.split() ##分離出r,g,b

print(b.mode)

print(im1.mode,im1.size)

print(im2.mode,im2.size)

im = Image.composite(im1,im2,b)

im.show()

最終效果


十7、Eval類

Image.eval(image,function) ⇒ image

使用變量function對應的函數(該函數應該有一個參數)處理變量image所表明圖像中的每個像素點。若是變量image所表明圖像有多個通道,那變量function對應的函數做用於每個通道。注意:變量function對每一個像素只處理一次,因此不能使用隨機組件和其餘生成器。

@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
def fun01(x):
    return x*0.3
def fun02(y):
    return y*2.0
im1_eval = Image.eval(im, fun01)
im2_eval = Image.eval(im, fun02)
im1_eval.show()
im2_eval.show()


在函數fun01和fun02下的圖像顯示。

 十8、Merge類

Image.merge(mode,bands) ⇒ image

合併類使用一些單通道圖像,建立一個新的圖像。變量bands爲一個圖像的元組或者列表,每一個通道的模式由變量mode描述。全部通道必須有相同的尺寸。
變量mode與變量bands的關係:

len(ImageMode.getmode(mode).bands)= len(bands)
@zhangziju

from PIL import Image

im1 = Image.open("E:\mywife.jpg")

im2 = Image.open("E:\mywife2.jpg")

r1,g1,b1 = im1.split()

r2,g2,b2 = im2.split()

print(r1.mode,r1.size,g1.mode,g1.size)

print(r2.mode,r2.size,g2.mode,g2.size)

new_im=[r1,g2,b2]

print(len(new_im))

im_merge = Image.merge("RGB",new_im)

im_merge.show()

打印信息顯示

 

                             


merge操做          

 


十9、Draft類

im.draft(mode,size)

配置圖像文件加載器,使得返回一個與給定的模式和尺寸儘量匹配的圖像的版本。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.size,im.mode)

new_im = im.draft("L", (200,200))

print(new_im.size,new_im.mode)

new_im.show()

關鍵信息顯示

                     

轉換效果   

 


二10、Getbands類

im.getbands()⇒ tuple of strings

返回包括每一個通道名稱的元組。例如,對於RGB圖像將返回(「R」,「G」,「B」)。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.getbands())

這裏寫圖片描述

                          
二11、Getbbox類

im.getbbox() ⇒ 4-tuple or None

計算圖像非零區域的包圍盒。這個包圍盒是一個4元組,定義了左、上、右和下像素座標。若是圖像是空的,這個方法將返回空。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.getbbox())

                               
二12、Getdata類

im.getdata() ⇒ sequence

以包含像素值的sequence對象形式返回圖像的內容。這個sequence對象是扁平的,以便第一行的值直接跟在第零行的值後面,等等。這個方法返回的sequence對象是PIL內部數據類型,它只支持某些sequence操做,包括迭代和基礎sequence訪問。使用list(im.getdata()),將它轉換爲普通的sequence。Sequence對象的每個元素對應一個像素點的R、G和B三個值。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

sequ = im.getdata()

sequ0 = list(sequ)

print(sequ0[0])

print(sequ0[1])

print(sequ0[2])

可視化顯示sequence0裏面的數據。

                                                     
打印顯示結果,與前面對比。

                                  
二十3、Getextrema類

im.getextrema() ⇒ 2-tuple

返回一個2元組,包括該圖像中的最小和最大值。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.getextrema())

該方法返回了R/G/B三個通道的最小和最大值的2元組。

                                 


二十4、Getpixel類

im.getpixel(xy) ⇒ value or tuple

返回給定位置的像素值。若是圖像爲多通道,則返回一個元組。該方法執行比較慢;若是用戶須要使用python處理圖像中較大部分數據,可使用像素訪問對象(見load),或者方法getdata()。
 

@zahngziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.getpixel((0,0)))

print(im.getpixel((4,0)))

r,g,b = im.split()

print(b.getpixel((11,8)))

                             

二十5、Histogram類

im.histogram()⇒ list

返回一個圖像的直方圖。這個直方圖是關於像素數量的list,圖像中的每一個象素值對應一個成員。若是圖像有多個通道,全部通道的直方圖會鏈接起來(例如,「RGB」圖像的直方圖有768個值)。二值圖像(模式爲「1」)看成灰度圖像(模式爲「L」)處理。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

imhis = im.histogram()

print(len(imhis))

print(imhis[0])

print(imhis[150])

print(imhis[300])

                             

im.histogram(mask)⇒ list

返回圖像中模板圖像非零地方的直方圖。模板圖像與處理圖像的尺寸必須相同,而且要麼是二值圖像(模式爲「1」),要麼爲灰度圖像(模式爲「L」)。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

r,g,b = im.split()

imhis = im.histogram()

print(r.mode)

print(len(imhis))

print(imhis[0])

print(imhis[150])

print(imhis[300])

         

二十6、Load類

im.load()

爲圖像分配內存並從文件中加載它(或者從源圖像,對於懶操做)。正常狀況下,用戶不須要調用這個方法,由於在第一次訪問圖像時,Image類會自動地加載打開的圖像。在1.1.6及之後的版本,方法load()返回一個用於讀取和修改像素的像素訪問對象。這個訪問對象像一個二維隊列,如:
 

pix = im.load()

print pix[x, y]

pix[x, y] =value

經過這個對象訪問比方法getpixel()和putpixel()快不少。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

pix = im.load()

print(pix[0,2])

                    

im.paste(colour,box)

使用同一種顏色填充變量box對應的區域。對於單通道圖像,變量colour爲單個顏色值;對於多通道,則爲一個元組。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

im.paste((256,256,0),(0,0,100,100)) ##(256,256,0)表示黃色

im.show()

                     
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

im.paste("blue",(0,0,100,100)) ##或者「blue」

im.show()

                     

im.paste(image,box, mask)

使用變量mask對應的模板圖像來填充所對應的區域。可使用模式爲「1」、「L」或者「RGBA」的圖像做爲模板圖像。模板圖像的尺寸必須與變量image對應的圖像尺寸一致。若是變量mask對應圖像的值爲255,則模板圖像的值直接被拷貝過來;若是變量mask對應圖像的值爲0,則保持當前圖像的原始值。變量mask對應圖像的其餘值,將對兩張圖像的值進行透明融合,若是變量image對應的爲「RGBA」圖像,即粘貼的圖像模式爲「RGBA」,則alpha通道被忽略。用戶可使用一樣的圖像做爲原圖像和模板圖像。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

box=[300,300,400,400]

im_crop =im.crop(box)

r,g,b =im_crop.split()

im.paste(im_crop, (200,200,300,300), r)

im.show()

               

二十7、Putdata類

im.putdata(data)
im.putdata(data, scale, offset)

從sequence對象中拷貝數據到當前圖像,從圖像的左上角(0,0)位置開始。變量scale和offset用來調整sequence中的值:

pixel = value*scale + offset

若是變量scale忽略,則默認爲1.0。若是變量offset忽略,則默認爲0.0。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

r, g, b = im.split()

print(

r.getpixel((0, 0)),

r.getpixel((1, 0)),

r.getpixel((2, 0)),

r.getpixel((3, 0)),

r.putdata([1, 2, 3, 4]),

r.getpixel((0, 0)),

r.getpixel((1, 0)),

r.getpixel((2, 0)),

r.getpixel((3, 0)),

)

                       


二十8、Resize類

im.resize(size) ⇒ image
im.resize(size, filter) ⇒ image

返回改變尺寸的圖像的拷貝。變量size是所要求的尺寸,是一個二元組:(width, height)。變量filter爲NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。若是忽略,或者圖像模式爲「1」或者「P」,該變量設置爲NEAREST。在當前的版本中bilinear和bicubic濾波器不能很好地適應大比例的下采樣(例如生成縮略圖)。用戶須要使用ANTIALIAS,除非速度比質量更重要。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

region = im.resize((400, 400)) ##從新設定大小

region.show()

                                            

很明顯因爲大小的從新設定,圖片的顯示效果有所轉變,gakki依然美膩~

二十9、Rotate類

im.rotate(angle) ⇒ image
im.rotate(angle,filter=NEAREST, expand=0) ⇒ image

返回一個按照給定角度順時鐘圍繞圖像中心旋轉後的圖像拷貝。變量filter是NEAREST、BILINEAR或者BICUBIC之一。若是省略該變量,或者圖像模式爲「1」或者「P」,則默認爲NEAREST。變量expand,若是爲true,表示輸出圖像足夠大,能夠裝載旋轉後的圖像。若是爲false或者缺省,則輸出圖像與輸入圖像尺寸同樣大。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

im_45 = im.rotate(45)

im_30 = im.rotate(30, Image.NEAREST,1)

print(im_45.size,im_30.size)

im_45.show()

im_30.show()

                                   

             

三10、Seek類

im.seek(frame)

在給定的文件序列中查找指定的幀。若是查找超越了序列的末尾,則產生一個EOFError異常。當文件序列被打開時,PIL庫自動指定到第0幀上。
 

@zhangziju

from PIL import Image

im_gif = Image.open("E:\mywife.gif")

print(im_gif.mode)

im_gif.show() ##第0幀

im_gif.seek(3)

im_gif.show()

im_gif.seek(9)

im_gif.show()

來來來~這是gakki原圖欣賞下~

                                                             

查找幀seek()的效果以下:

      


三11、Tell類

im.tell() ⇒ integer

返回當前幀所處位置,從0開始計算。

@zhangziju

from PIL import Image

im_gif = Image.open("E:\mywife.gif")

print(im_gif.tell())

im_gif.seek(8)

print(im_gif.tell())

                          


三12、Thumbnail類

im.thumbnail(size)
im.thumbnail(size, filter)

修改當前圖像,使其包含一個自身的縮略圖,該縮略圖尺寸不大於給定的尺寸。這個方法會計算一個合適的縮略圖尺寸,使其符合當前圖像的寬高比,調用方法draft()配置文件讀取器,最後改變圖像的尺寸。變量filter應該是NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。若是省略該變量,則默認爲NEAREST。注意:在當前PIL的版本中,濾波器bilinear和bicubic不能很好地適應縮略圖產生。用戶應該使用ANTIALIAS,圖像質量最好。若是處理速度比圖像質量更重要,能夠選用其餘濾波器。這個方法在原圖上進行修改。若是用戶不想修改原圖,可使用方法copy()拷貝一個圖像。這個方法返回空。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

im.thumbnail((100,100))

三十3、Transform類

    im.transform(size,method, data) ⇒ image
    im.transform(size, method, data, filter) ⇒ image

使用給定的尺寸生成一張新的圖像,與原圖有相同的模式,使用給定的轉換方式將原圖數據拷貝到新的圖像中。在當前的PIL版本中,參數method爲EXTENT(裁剪出一個矩形區域),AFFINE(仿射變換),QUAD(將正方形轉換爲矩形),MESH(一個操做映射多個正方形)或者PERSPECTIVE。變量filter定義了對原始圖像中像素的濾波器。在當前的版本中,變量filter爲NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。若是忽略,或者圖像模式爲「1」或者「P」,該變量設置爲NEAREST。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.size)

imtra = im.transform((200, 200), Image.EXTENT, (0, 0, 500, 500))

print(imtra.size)

imtra.show()

 

                                     

                                                                             

im.transform(size,EXTENT, data) ⇒ image
im.transform(size, EXTENT, data, filter) ⇒ image

從圖像中裁剪一個區域。變量data爲指定輸入圖像中兩個座標點的4元組(x0,y0,x1,y1)。輸出圖像爲這兩個座標點之間像素的採樣結果。例如,若是輸入圖像的(x0,y0)爲輸出圖像的(0,0)點,(x1,y1)則與變量size同樣。這個方法能夠用於在當前圖像中裁剪,放大,縮小或者鏡像一個任意的長方形。它比方法crop()稍慢,可是與resize操做同樣快。

im.transform(size, AFFINE, data) ⇒ image
im.transform(size, AFFINE,data, filter) ⇒ image

對當前的圖像進行仿射變換,變換結果體如今給定尺寸的新圖像中。變量data是一個6元組(a,b,c,d,e,f),包含一個仿射變換矩陣的第一個兩行。輸出圖像中的每個像素(x,y),新值由輸入圖像的位置(ax+by+c, dx+ey+f)的像素產生,使用最接近的像素進行近似。這個方法用於原始圖像的縮放、轉換、旋轉和裁剪。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.size)

imtra = im.transform((200, 200), Image.AFFINE, (1,2,3,2,1,4))

print(imtra.size)

imtra.show()

                     


                                                            

im.transform(size,QUAD, data) ⇒ image
im.transform(size, QUAD, data, filter) ⇒ image

輸入圖像的一個四邊形(經過四個角定義的區域)映射到給定尺寸的長方形。變量data是一個8元組(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四邊形的左上,左下,右下和右上四個角。

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.size)

imtra = im.transform((200, 200), Image.QUAD, (0,0,0,500,600,500,600,0))

print(imtra.size)

imtra.show()

 

                            
                                                               

im.transform(size,PERSPECTIVE, data) ⇒ image
im.transform(size, PERSPECTIVE, data, filter) ⇒ image

對當前圖像進行透視變換,產生給定尺寸的新圖像。變量data是一個8元組(a,b,c,d,e,f,g,h),包括一個透視變換的係數。對於輸出圖像中的每一個像素點,新的值來自於輸入圖像的位置的(a x + b y + c)/(g x + h y + 1), (d x+ e y + f)/(g x + h y + 1)像素,使用最接近的像素進行近似。這個方法用於原始圖像的2D透視。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.size)

imtra = im.transform((200, 200), Image.PERSPECTIVE, (1,2,3,2,1,6,1,2))

print(imtra.size)

imtra.show()

                            
wocao!!!gakki不見了!!!

                                                                 


三十4、Transpose類

im.transpose(method)⇒ image

返回當前圖像的翻轉或者旋轉的拷貝。變量method的取值爲:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,或ROTATE_270。
 

@zhangziju

from PIL import Image

im = Image.open("E:\mywife.jpg")

im.rotate(45) #逆時針旋轉 45 度角。

im.transpose(Image.FLIP_LEFT_RIGHT) #左右對換。

im.transpose(Image.FLIP_TOP_BOTTOM) #上下對換。

im.transpose(Image.ROTATE_90) #旋轉 90 度角。

im.transpose(Image.ROTATE_180) #旋轉 180 度角。

im.transpose(Image.ROTATE_270) #旋轉 270 度角。

三十5、ImageDraw

from PIL import Image,ImageDraw

首先建立一個圖片或者打開一個圖片

blank = Image.new("RGB",[1024,768],"white")

建立一個可用來Image操做的對象(必須)

drawObj = ImageDraw.Draw(blank)

直線

# 建立一個正方形。 [x1,x2,y1,y2]或者[(x1,x2),(y1,y2)]  fill表明的爲顏色
drawObj.line([100,100,100,600],fill='red')
drawObj.line([100,100,600,100],fill='red')
drawObj.line([600,100,600,600],'black')
drawObj.line([100,600,600,600],'red')
# blank.save('white.jpg','jpeg')

弧線

# 弧形 [x1,x2,y1,y2]  弧度 顏色
drawObj.arc([100,100,600,600],0,360,fill='black')
drawObj.arc([200,100,500,600],0,360,fill='red')
blank.save('black.jpg','jpeg')

# 畫圓  [x1,x2,y1,y2] outline邊框顏色 fill填充顏色
drawObj.ellipse([100,100,600,600],outline='black',fill='white')
blank.save('black.jpg','jpeg')

半圓

# 畫半圓 [x1,x2,y1,y2]  弧度 outline絃線顏色 fill填充顏色
drawObj.chord([100,100,600,600],0,360,outline=125)
drawObj.chord([100,100,600,600],0,90,outline=158)
drawObj.chord([100,100,600,600],90,180,outline=99,fill='red')
blank.save('black.jpg','jpeg')

扇形

# 扇形 [x1,x2,y1,y2]  弧度 outline絃線顏色 fill填充顏色
drawObj.pieslice([100,100,600,600],180,210,outline=255)
drawObj.pieslice([100,100,600,600],30,80,fill=255)
blank.save('black.jpg','jpeg')

多邊形

# 多邊形
drawObj.polygon([10,23,45,6,77,87],outline='red')
drawObj.polygon([10,20,30,40,50,90,70,80,90,100],fill='red')
blank.save('black.jpg','jpeg')

矩形

# 矩形
drawObj.rectangle((200,200,500,500),outline = "red")
drawObj.rectangle((250,300,450,400),fill = 128)
blank.save('black.jpg','jpeg')

加入文字

# 文字
text = 'i\'m very happy'
# 顏色
drawObj.ink = 0 + 0 * 256 + 255 * 256 * 256
# 加載到圖片上
drawObj.text([300,500],text)
blank.save('black.jpg','jpeg')

三十6、ImageFont

from PIL import ImageFont
# 字體 路徑 文字大小
font1 = ImageFont.truetype(r'C:\Windows\Fonts\ahronbd.ttf',36)
text = 'i\'m very happy'
     
     
# 設置 文字位置 文字內容 顏色 文字大小
drawObj.text([100,500],text,'red',font=font1)
     
blank.save('black.jpg','jpeg')

 


承接Matlab、Python和C++的編程,機器學習、計算機視覺的理論實現及輔導,本科和碩士的都可,鹹魚交易,專業回答請走知乎,詳談請聯繫QQ號757160542,非誠勿擾。

本文同步分享在 博客「於小勇」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索