一:PIL功能介紹與安裝
PIL,全稱Python Image Library,主要作用是影像處理,可用于圖片剪切、粘貼、縮放、鏡像、水印、顏色塊、濾鏡、影像格式轉換、色場空間轉換、驗證碼、旋轉影像、影像增強、直方圖處理、插值和濾波等功能,不過只支持到Python 2.7,Pillow是PIL的一個派生分支,但如今已經發展成為比PIL本身更具活力的影像處理庫,我們需要安裝的就是Pillow,
PIL具體用途:
- 影像歸檔(Image Archives),PIL非常適合于影像歸檔以及影像的批處理任務,你可以使用PIL創建縮略圖,轉換影像格式,列印影像等等,
- 影像展示(Image Display),PIL較新的版本支持包括Tk PhotoImage,BitmapImage還有Windows DIB等介面,PIL支持眾多的GUI框架介面,可以用于影像展示,
- 影像處理(Image Processing),PIL包括了基礎的影像處理函式,包括對點的處理,使用眾多的卷積核(convolution kernels)做過濾(filter),還有顏色空間的轉換,PIL庫同樣支持影像的大小轉換,影像旋轉,以及任意的仿射變換,PIL還有一些直方圖的方法,允許你展示影像的一些統計特性,這個可以用來實作影像的自動對比度增強,還有全域的統計分析等,
pip install Pillow
貌似Pillow是默認安裝好了的,可以通過pip list查看是否已經安裝
二:PIL的基本操作
以下是打開圖片保存圖片的基本操作,
from PIL import Image
# 1.打開圖片
img = Image.open("image/10.png")
# 2.顯示圖片(執行顯示圖片后執行緒會中斷,關閉影像后恢復)
img.show()
# 3.保存圖片
img.save("image/xiaomai.png")
我在嘗試的程序中發現,png格式的圖片保存為jpg格式時會報錯:OSError: cannot write mode RGBA as JPEG,經過查閱資料發現錯誤原因主要是因為PNG格式和JPG格式圖片的通道數不同,
- PNG是四通道:RGBA意思是紅色,綠色,藍色,Alpha的色彩空間,Alpha指透明度
- JPG是三通道:RGB意思是紅色,綠色,藍色
所以,PNG格式圖片要保存成JPG格式就要丟棄A通道:
from PIL import Image
# 1.打開圖片
img = Image.open("image/10.png")
# 2.顯示圖片(執行顯示圖片后執行緒會中斷,關閉影像后恢復)
img.show()
# 3.保存圖片
img = img.convert("RGB")
img.save("image/xiaomai.jpg")
下面是圖片旋轉的代碼:
from PIL import Image
# 1.打開圖片
img = Image.open("pli/7.png")
# 2.水平翻轉
img1 = img.transpose(Image.FLIP_LEFT_RIGHT)
# 3.保存圖片
img1.save("pli/1.png")
# 4.垂直翻轉
img2 = img.rotate(180)
# 5.保存照片
img2.save("pli/2.png")
# 6.水平+垂直翻轉
img3 = img.transpose(Image.FLIP_LEFT_RIGHT).rotate(180)
# 7.保存圖片
img3.save("pli/3.png")

三:給圖片增加文字
要在影像上繪制文本要用到 PIL 的兩個模塊:ImageDraw和ImageFont, ImageDraw 用于創建繪圖物件,ImageFont用于加載字體,
from PIL import Image, ImageDraw, ImageFont
# 1.打開圖片
img = Image.open("image/10.png")
# 2.呼叫畫圖模塊
draw = ImageDraw.Draw(img)
# 3.設定字體
tfont = ImageFont.truetype("萌神手寫體.ttf", 24)
# 4.添加文字
"""
引數一:文字在圖片的位置:(x, y)
引數二:文字內容
引數三:字體顏色,當然顏色也可以用RGB值指定
引數四:字體型別
"""
draw.text((50, 30), "eyes++", fill="green", font=tfont)
# 5.保存圖片
img.save("image/addWord.png")
# 6.顯示圖片
img.show()

四:PIL濾鏡功能
from PIL import Image, ImageFilter
img = Image.open("image/10.png")
img = img.filter(ImageFilter.CONTOUR)
img.save("image/Filter.png")
img.show()

濾鏡型別如下:

五:PIL鏡像功能
from PIL import Image
img = Image.open("image/10.png")
img = img.transpose(Image.FLIP_LEFT_RIGHT)
img.save("image/mirror.png")
transpose有這么幾種模式
- FLIP_LEFT_RIGHT:左右鏡像
- FLIP_TOP_BOTTOM:上下鏡像
- ROTATE_90:逆時針轉90度
- ROTATE_180:逆時針轉180度
- ROTATE_270:逆時針轉270度
- TRANSPOSE:像素矩陣轉置
- TRANSVERSE
最后一種模式我也不知道什么意思,也沒查到,但效果是下面這樣的,盲猜是對角線對轉,,,,,
除了使用transpose制造鏡像,使用rotate也可以的,不過rotate只能旋轉:

發現這樣旋轉會有棱角,然后經過某位不愿透露姓名的大佬指點,發現是rotate旋轉只是像素旋轉,畫布不動,于是我寫下了以下測驗代碼:
from PIL import Image
img = Image.open("image/12.jpg")
img1 = img.transpose(Image.ROTATE_90)
img1.save("image/test.jpg")
img2 = img.rotate(90)
img2.save("image/test2.jpg")
可以發現小埋的rotate旋轉不會自動填充空白像素,而血小板的會自動黑色填充,是因為png格式是非失真性壓縮的,允許使用類似于GIF格式的調色板技術,支持真彩色影像,并具備阿爾法通道(半透明)等特性,而jpg格式沒有阿爾法通道,因此jpg格式圖片不能為透明,png格式可以,
六:圖片拼接功能
雖說是拼接,但更像是將兩幅圖粘貼到一個新的畫布上
from PIL import Image, ImageDraw
# 打開圖片
img1 = Image.open("image/10.png")
img2 = Image.open("image/addWord.png")
# 查看圖片尺寸,便于拼接圖片
print(img1.size)
print(img1.size)
# 新建空白圖片,三個引數分別是模式(RGB/RGBA)、大小、顏色
newimg = Image.new(mode="RGB", size=(1174, 614), color=(255, 100, 50))
# 拼接圖片,第一個引數是圖片,第二個是起始位置
newimg.paste(img1, (0, 0))
newimg.paste(img2, (587, 0))
newimg.show()

七:PIL裁剪功能
圖片裁剪用到的方法是image.crop(),這個方法能從影像中提取出某個矩形大小的影像,它接收一個四元素的元組作為引數,各元素為(left, upper, right, lower),坐標系統的原點(0, 0)是左上角,
from PIL import Image
img = Image.open("image/10.png")
print(img.size)
imgCut = img.crop((100, 200, 500, 600))
imgCut.show()
在這里插入代碼片
八:圖片縮放
可能這么看不是二分之一,但這是顯示問題,可以看資料:
from PIL import Image
# :
img = Image.open('image/10.png')
# 獲得影像尺寸:
w, h = img.size
# 縮放到50%:
img.thumbnail((w//2, h//2))
# 把縮放后的影像用jpeg格式保存:
img.save('image/zoom.png')

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312251.html
標籤:其他
