第二篇 Python圖片處理模塊PIL(pillow)


本篇包含:16、Point    17、Putalpha    18、Putdata    19、Putpalette    20、Putpixel      21、Quantize     22、Resize   23、Rotate     24、Save                                   25、Seek    26、Show   27、Split    28、Tell     29、Thumbnail    30、Tobitmap     31、Transform     32、Transpose    33、Verify

16、  Point

定義1:im.point(table)⇒ image
      im.point(function) ⇒ image
含義1:返回給定查找表對應的圖像像素值的拷貝。變量table為圖像的每個通道設置256個值。如果使用變量function,其對應函數應該有一個參數。這個函數將對每個像素值使用一次,結果表格將應用於圖像的所有通道。

如果圖像的模式為“I(整數)”或者“F(浮點)”,用戶必須使用function方式,function必須按照下面的格式:
argument * scale+ offset
例如:
out = im.point(lambda i: i * 1.2 + 10)
用戶可以省略變量scale和offset。

例子1:
from PIL import Image
im = Image.open("jing.png")
im_point = im.point(lambda x:x*1.3+5)
im_point.save("he.png")
注:圖像im_point_fun比原圖im01亮度增加了很多;因為lambda表達式中對原圖的每個像素點的值都做了增加操作。
 
定義2:im.point(table,mode) ⇒ image
      im.point(function, mode) ⇒ image
含義2:與定義1一樣,但是它會為輸出圖像指定一個新的模式。這個方法可以一步將模式為“L”和“P”的圖像轉換為模式為“1”的圖像。

例子2:
from PIL import Image
im = Image.open("jing.png")
r,g,b = im.split()
im_point1 = r.point(lambda x:x*1.3+5,"1")
print(im_point1.getpixel((0,0)))
im_point1.save("he1.png")
im_point2 = r.point(lambda  x:0,"1")
im_point2.save("he2.png")
print(im_point2.getpixel((10,10)))
輸出為:
6
0
圖像im_point1為全白圖 圖像im_point2為全黑圖

17、  Putalpha

定義:im.putalpha(band)
含義:將給定的通道拷貝到圖像的alpha層。此處的圖像模式必須為“RGBA”,變量band必須為“L”或者“1”。
(New in PIL 1.1.5)方法putalpha()也可以用於其他模式;圖像原地轉換為有alpha通道的模式(通常轉換為“LA”或者“RGBA”)。變量band要么為圖像,要么為顏色值(一個整數)。

例子:
from PIL import Image
im =Image.open("xiao.png")
im1.mode
im1.putalpha(100)
print(im1.mode)
print(im1.getpixel((0,0)))
輸出:
'RGB'
'RGBA'
(11, 113, 198,100)

18、  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。

例子:
from PIL import Image
im =Image.open("jing.png")
r,g,b =im.split()
print(r.getpixel((0,0)))
print(r.getpixel((1,0)))
print(r.getpixel((2,0)))
print(r.getpixel((3,0)))
r.putdata([1,2,3,4])
print(r.getpixel((0,0)))
print(r.getpixel((1,0)))
print(r.getpixel((2,0)))
print(r.getpixel((3,0)))
輸出:
11
10
9
6
1
2
3
4

19、  Putpalette

定義:im.putpalette(sequence)
含義:為“P”或者“L”圖像增加一個調色板。對於“L”圖像,它的模式將變化為“P”。調色板序列需要包含768項整數,每組三個值表示對應像素的紅,綠和藍。用戶可以使用768個byte的字符串代替這個整數序列。
例子:
from PIL import Image im =Image.open("jing.png") r,g,b = im01.split() print(r.mode) r.putpalette([1,2,3]) print(r.mode) 輸出: 'L' 'P'

20、  Putpixel

定義:im.putpixel(xy,colour)
含義:修改指定位置上的像素值。對於單通道圖像,變量colour為一個數值;對於多通道圖像,變量colour為一個元組。
注意:這個方法執行比較慢。如果是1.1.6版本,像素訪問對象(參考load方法)提供了一個更快的方法修改圖像。
     如果用戶要生成整幅圖像,可以使用更有效的方法產生一個python list,然后使用方法putdata()將它拷貝到圖像上去。對於更大的改變,使用方法paste或者ImageDraw模塊。

例子:
from PIL import Image
im =Image.open("jing.png")
print(im.getpixel((0,0)))
im.putpixel((0,0),(1,2,3))
print(im.getpixel((0,0)))
輸出:
(11, 113, 198)
(1, 2, 3) 

21、  Quantize

定義:im.quantize(colors,**options) ⇒ image
含義:(不贊成)使用給定的顏色將“L”或者“RGB”圖像轉換為“P”圖像,返回新的圖像。
新的代碼中,使用有自適應的調色板的convert方法來代替:
out =im.convert("P", palette=Image.ADAPTIVE,colors=256) 

22、  Resize

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

23、  Rotate

定義:im.rotate(angle) ⇒ image
     im.rotate(angle,filter=NEAREST, expand=0) ⇒ image
含義:返回一個按照給定角度順時鍾圍繞圖像中心旋轉后的圖像拷貝。
變量filter應該是NEAREST、BILINEAR或者BICUBIC之一。如果省略該變量,或者圖像模式為“1”或者“P”,則默認為NEAREST。
變量expand,如果為true,表示輸出圖像足夠大,可以裝載旋轉后的圖像。如果為false或者缺省,則輸出圖像與輸入圖像尺寸一樣大。

例子:
from PIL import Image
im = Image.open("jing.png")
im_30 = im.rotate(30)
im_30.save("he1.png")
im_31 = im.rotate(30,Image.BICUBIC,1)
im_31.save("he2.png")
注:im_30旋轉30度大小不變,im_31旋轉30度大小改變

24、  Save

定義:im.save(outfile,options…)
     im.save(outfile, format, options…)
含義:使用給定的文件名保存圖像。如果變量format缺省,如果可能的話,則從文件名稱的擴展名判斷文件的格式。該方法返回為空。
     關鍵字options為文件編寫器提供一些額外的指令。如果編寫器不能識別某個選項,它將忽略它。
     用戶可以使用文件對象代替文件名稱。在這種情況下,用戶必須指定文件格式。文件對象必須實現了seek()、tell()和write()方法,且其以二進制模式打開。
     如果方法save()因為某些原因失敗,這個方法將產生一個異常(通常為IOError異常)。如果發生了異常,該方法也有可能已經創建了文件,並向文件寫入了一些數據。如果需要的話,用戶的應用程序可以刪除這個不完整的文件。

25、  Seek

定義:im.seek(frame)
含義:在給定的文件序列中查找指定的幀。如果查找超越了序列的末尾,則產生一個EOFError異常。當文件序列被打開時,PIL庫自動指定到第0幀上。
注意:在當前的版本上,大多數序列格式只允許用戶查找下一幀,不能跳躍式查找指定的幀。

例子:

from PIL import Image
im_gif = Image.open("xin.gif")
print(im_gif.mode)
im_gif.seek(2)
im_gif.save("he1.png")
im_gif.seek(8)
im_gif.save("he2.png")
輸出:
'P' 注:通過上面的code,分別找到了第2幀和第8幀圖像。

26、  Show

定義:im.show()
含義:顯示一張圖像。這個方法主要用於調試。
在Unix平台,這個方法將圖像保存為臨時的PPM文件,並且調用xv功能。
在widows中,它將圖像保存為臨時的BMP文件,並且使用標准的BMP顯示功能顯示它。
這個方法返回空。

例子:
from PIL import Image
im = Image.open("jing.png")
im.show()

27、  Split

定義:im.split() ⇒ sequence
含義:返回當前圖像各個通道組成的一個元組。例如,分離一個“RGB”圖像將產生三個新的圖像,分別對應原始圖像的每個通道(紅,綠,藍)。

例子:
from PIL import Image
im = Image.open("jing.png")
r,g,b = im.split()
b.save("he.png")
print(b.getpixel((1,3)))

28、  Tell

定義:im.tell() ⇒ integer
含義:返回當前幀所處位置,從0開始計算。

例子:
from PIL import Image
im_gif = Image.open("xin.gif")
print(im_gif.tell())
im_gif.seek(8)
print(im_gif.tell())
輸出:
0
8

29、  Thumbnail

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

例子:
from PIL import Image
im = Image.open("jing.png")
im.thumbnail((10,10))
im.save("he.png")
注:已經為圖像im01創建了不大於10x10的縮略圖。

30、  Tobitmap

定義:im.tobitmap()⇒ string
含義:返回轉換為X11的bitmap圖像。

31、  Transform

定義1:im.transform(size,method, data) ⇒ image
      im.transform(size, method, data, filter) ⇒ image
含義1:使用給定的尺寸生成一張新的圖像,與原圖有相同的模式,使用給定的轉換方式將原圖數據拷貝到新的圖像中。
      在當前的PIL版本中,參數method為EXTENT(裁剪出一個矩形區域),AFFINE(仿射變換),QUAD(將正方形轉換為矩形),MESH(一個操作映射多個正方形)或者PERSPECTIVE。
      變量filter定義了對原始圖像中像素的濾波器。在當前的版本中,變量filter為NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者圖像模式為“1”或者“P”,該變量設置為NEAREST。
含義2:從圖像中裁剪一個區域。
      變量data為指定輸入圖像中兩個坐標點的4元組(x0,y0,x1,y1)。輸出圖像為這兩個坐標點之間像素的采樣結果。例如,如果輸入圖像的(x0,y0)為輸出圖像的(0,0)點,(x1,y1)則與變量size一樣。
      這個方法可以用於在當前圖像中裁剪,放大,縮小或者鏡像一個任意的長方形。它比方法crop()稍慢,但是與resize操作一樣快。
含義3:對當前的圖像進行仿射變換,變換結果體現在給定尺寸的新圖像中。
      變量data是一個6元組(a,b,c,d,e,f),包含一個仿射變換矩陣的第一個兩行。輸出圖像中的每一個像素(x,y),新值由輸入圖像的位置(ax+by+c, dx+ey+f)的像素產生,使用最接近的像素進行近似。
      這個方法用於原始圖像的縮放、轉換、旋轉和裁剪。
定義4:im.transform(size,QUAD, data) ⇒ image im.transform(size, QUAD, data, filter) ⇒ image 含義4:輸入圖像的一個四邊形(通過四個角定義的區域)映射到給定尺寸的長方形。 變量data是一個8元組(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四邊形的左上,左下,右下和右上四個角。 含義5:與QUAD類似,但是變量data是目標長方形和對應源四邊形的list。 定義6:im.transform(size,PERSPECTIVE, data) ⇒ image im.transform(size, PERSPECTIVE, data, filter) ⇒ image 含義6:對當前圖像進行透視變換,產生給定尺寸的新圖像。 變量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透視。

32、  Transpose

定義:im.transpose(method)⇒ image
含義:返回當前圖像的翻轉或者旋轉的拷貝。
變量method的取值為:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,或者ROTATE_270。

例子:
from PIL import Image
im = Image.open("jing.png")
im = im01.transpose(Image.FLIP_LEFT_RIGHT)
注:圖像im為圖像im01的水平方向鏡像。

33、    Verify

定義:im.verify()
含義:嘗試判斷文件是否損壞,實際上並沒有對圖像數據進行解析。如果這個方法發現了任何問題,它將產生對應的異常。這個方法只工作於剛打開的圖像;如果圖像已經被加載,該方法的結果將會是未定義的。如果用戶在使用這個方法后需要加載圖像,用戶需要重新打開圖像文件。
注意:這個方法不能捕獲所有的錯誤;要捕獲解碼錯誤,用戶必須加載整個圖像。

例子:
from PIL import Image
im01 = Image.open("jing.png")
im01.verify()
注:沒有任何輸出,表示圖像im01是沒有損壞的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM