《Python 程式設計快速上手——讓繁瑣工作自動化》第十七章 · 操作影象
技術標籤:Python學習
PILLOW的中文文件在這裡。
模組 :Pillow
一、 計算機影象基礎
1. 顏色和RGBA值
計算機程式將影象中的顏色表示為RGBA。RGBA是一組數字,指定顏色中的紅、綠、藍和alpha(透明度)的值。這些值是從0(根本沒有)到255(最大)的整數。如:
紅色 (255, 0, 0, 255)
綠色 (0, 255, 0, 255)
藍色 (0, 0, 255, 255)
黑色 (0, 0, 0, 255)
不知道所用顏色的RGBA值也沒有關係,可以用:
- ImageColor.getcolor()函式
作用: 接受一個顏色名稱字串作為第一個引數,字串“RGBA”作為第二個引數,返回一個RGBA元組
from PIL import ImageColor
ImageColor.getcolor('red', 'RGBA')
ImageColor.getcolor("Blue", 'RGBA')#不區分大小寫
上述程式碼分別返回紅色和藍色對應的RGBA值
2. 座標和Box元組
影象畫素用x和y座標指定,分別指定畫素在影象中的水平和垂直位置。原點位於左上角。
- 矩形元組引數 - - 包括左和頂座標,直到但是不包括右和底座標
二、 用Pillow操作影象
- Image.open() 函式
作用:該函式的返回值是Image物件資料型別,它是Pillow將影象作為Python值的方法。
2.1 處理Image資料型別
Image物件包含的屬性載入了影象檔案的基本資訊,包括寬度,高度,檔名,影象格式等。
程式碼舉例:
from PIL import Image #Pillow模組的名字是PIL,這保持與老模組Python Imaging Library 相容
catIm = Image.open("zophie.png") #影象要儲存在當前資料夾,否則就要用絕對路徑
catIm.size
width, height = catIm.size #多重賦值技巧,將寬和高分別賦值給width和height
print(width, height)
catIm.filename #檔名
catIm.format_description #影象格式
catIm.save('zophie.jpg') #檔案拓展名是什麼,就用什麼格式儲存下來
- image.new( )
作用:返回一個新的Image物件
包含引數:
- 字串‘RGBA’
- 大小,寬度和高度的元組
- 背景顏色
程式碼舉例:
im = Image.new("RGBA", (300, 100), 'purple')
im.save("purpleImage.png")
im2 = Image.new("RGBA", (300,100)) #沒有指定顏色,那麼就預設為不可見的黑色 (0, 0, 0, 0)
im2.save('transparentsImage.png')
2.2 裁剪圖片
意涵: 在影象內選擇一個矩形區域,並刪除矩形區域外的一切。
- crop()
作用: 接受一個矩形元組,返回一個Image物件 。返回的是新的物件,元物件不會改變
程式碼舉例:
from PIL import Image
croppedIm = catIm.crop((355, 345, 565, 560))
croppedIm.save("Cropped.png")
2.3 複製和貼上影象到其他影象
- copy( )
**作用:**返回一個新的Image物件
程式碼舉例:
catIm = Image.open('zophie.png')
catcopyIm = catIm.copy()
- paste( )
作用: 在Image物件(主Image物件)上呼叫,將另一個影象(源Image物件)貼上在它上面
程式碼舉例:
faceIm = catIm.crop((335, 345, 565, 560))
catcopyIm.paste(faceIm, (0, 0))
catcopyIm.paste(faceIm, (400, 500))
catcopyIm.save("pasted.png")
上述程式碼實現在原點和在(400, 500)處貼上影象
catImWidth, catImHeight = catIm.size
faceImWidth, faceImHeight = faceIm.size
catCopyTwo = catIm.copy()
for left in range(0, catImWidth, faceImWidth):
for top in range(0, catImHeight, faceImHeight):
print(left, top)
catCopyTwo.paste(faceIm, (left, top))
catCopyTwo.save('tiled.png')
上述程式碼實現平鋪效果
2.4 調整影象大小
- resize()方法
作用: 在Image物件上呼叫,返回指定寬度和高度的新Image物件。它不會修改原Image,而是會建立一個新的Image。
用法: 接受兩個整數作為引數,表示返回影象的新寬度和新高度
程式碼舉例:
catIm = Image.open("zophie.png")
width, height = catIm.size
quartersizeIm = catIm.resize((int(width / 2), int(height / 2)))
quartersizeIm.save('quartersized.png')
svelteIm = catIm.resize((width, height + 300))
svelteIm.save('svelte.png')
2.5 旋轉和翻轉影象
- rotate()
**作用:**返回旋轉後的新Image物件
程式碼舉例:
from PIL import Image
catIm = Image.open('zophie.png')
catIm.rotate(90).save("rotated90.png") #連續呼叫
-
- expand 關鍵字引數
設定為True, 就會放大影象的尺寸,以適應這個旋轉後的影象。如:
- expand 關鍵字引數
catIm.rotate(36, expand = True).save("rotated36.png")
- transpose()
作用: 得到影象的映象翻轉
TIPS: 必須傳入引數 FLIP_LEFT_RIGHT 或者 FLIP_TOP_BOTTOM
程式碼舉例:
catIm.transpose(Image.FLIP_LEFT_RIGHT).save("horizontal_flip.png")
catIm.transpose(Image.FLIP_TOP_BOTTOM).save("vertical_flip.png")
2.6 更改單個畫素
- getpixel()
- putpixel()
作用:接受元組,作為畫素的x和y座標 ; putpixel()還接受一個元組,作為該畫素的顏色 要用RGBA或者RGB
程式碼舉例:
from PIL import Image
im = Image.new('RGBA', (100, 100))
im.getpixel((0,0))
for x in range(100):
for y in range(50):
im.putpixel((x, y), (128, 128, 128, 255))
from PIL import ImageColor
for x in range(100):
for y in range(50, 100):
im.putpixel((x, y), ImageColor.getcolor('darkgray', "RGBA"))
im.save("putPixel.png")
三、 在影象上繪畫
Pillow 的 ImageDraw 模組
要利用這個模組,就首先要輸入以下程式碼
from PIL import Image, ImageDraw
im = Image.new('RGBA', (200, 200), 'white') #先得到一個Image物件
draw = ImageDraw.Draw(im) #然後再將這個Image物件傳遞給ImageDraw.Draw()函式,
#得到一個ImageDraw物件
3.1 繪製形狀
- line(xy, fill, width)
作用: 繪製線條
TIPS: xy是一個元組的列表, fille是線的顏色
如:draw.line([(0, 0), (199, 0), (199, 199), (0, 199), (0, 0)], fill='black')
用line()繪製網狀圖形舉例:
for i in range(100, 200, 10):
draw.line([(i, 0), (200, i - 100)], fill="green")
im.save("drawing.png")
繪製結果如下:
-
rectangle(xy, fill, outline)
作用:繪製方格
TIPS:xy是矩形元組,形式是(left, top, right, bottom)
如:draw.rectangle((20, 30, 60, 60), fill="blue")
-
ellipse(xy, fill, outline)
作用: 繪製橢圓
如:draw.ellipse((120, 30, 160, 60), fill="red")
-
polygon(xy, fill, outline)
作用:繪製多邊形
如:draw.polygon(((57, 87), (79, 62), (94, 85), (120, 90), (103, 113)), fill="brown")
3.2 繪製文字
ImageDraw 的text()方法, 有四個引數 :
- xy
- text
- fill 文字顏色
- font 一個imageFont物件,用於設定文字的字型和大小
另外的方法 - textsize()方法,它的第一個引數是要測量的文字字串,第二個引數是可選的imageFont物件 ,返回一個兩整數元組,表示輸出文字的寬度和高度 用這個方法可以幫助你準確計算文字放在影象上的位置。
程式碼舉例:
from PIL import Image, ImageDraw, ImageFont
import os
im = Image.new("RGBA", (200, 200), "white")
draw = ImageDraw.Draw(im)
draw.text((20, 150), 'Hellow', fill="purple")
FontFolder = '/Users/clufier/sites/opcai/vendor/topthink/think-captcha/assets/ttfs'
arialFont = ImageFont.truetype(os.path.join(FontFolder,'2.ttf'), 22)
draw.text((100, 150), 'Howdy', fill='gray', font=arialFont)
im.save("text.png")