處理圖像需要理解圖像模式。所謂圖像模式就是把色彩分解成部分顏色組件,對顏色組件不同的分類就形成了不同的色彩模式,不同的色彩模式可以影響圖像的通道數目和文件大小。pillow 支持以下圖像模式:
圖像模式說明1黑白,每個像素用1位表示,但存儲時每個像素佔用1個字節L黑白,每個像素用1個字節表示P調色板映射,每個像素用1個字節表示RGB紅綠藍,3通道,每個像素用1個字節表示RGBA紅綠藍和透明,4通道,每個像素用1個字節表示CMYK顏色隔離模式,4通道,每個像素用1個字節表示YCbCr亮度藍色差紅色差,3通道,每個像素用1個字節表示I每個像素用4個字節整型表示F每個像素用4個字節浮點型表示3. 常用功能在日常應用過程中,使用最多的是 pillow 提供的 Image 模塊,其提供了包括圖像存儲、變換以及一系列的相關處理功能。pillow 模塊中的 ImageDraw 類提供了一系列繪圖方法,ImageGrab 模塊則提供了將屏幕或剪貼板的內容複製到 PIL 圖像內存的功能。通常,使用下面的方法,導入 pillow 的一個或多個子模塊如下:
from PIL import Image, ImageDraw, ImageGrab
假定我們需要的子模塊均已經導入,下面我們來演示一下這三個模塊的基本用法。
3.1 打開圖像文件>>> im = Image.open(r'D:\CSDN\python_counselor.jpg')
>>> im.show() # show()方法會自動調用系統默認的圖像查看工具顯示圖像
>>> im = Image.open(r'D:\CSDN\python_counselor.jpg')
>>> im.save(r'D:\CSDN\python_counselor.bmp') # 讀出.jpg文件,可以直接保存為.bmp文件
>>> im = Image.new("RGBA", (320, 240), color=(0,255,255,128)) # 新建320x240的半透明青色背景的圖片
>>> im.show()
>>> im = Image.open(r'D:\CSDN\python_counselor.jpg')
>>> im.mode # 查看圖像模式
'RGB'
>>> im_gray = im.convert('L') # 將RGB彩色模式轉為灰度模式
>>> im_gray.show()
3.5 通道合併與拆分
>>> im = Image.open(r'D:\CSDN\Transp400.png')
>>> im.mode # # png格式的圖像有4個通道
'RGBA'
>>> im_rgb = im.convert('RGB') # 固然可以使用convert()將RGBA模式轉換為RGB模式
>>> r,g,b,a = im.split() # 還可以將RBGA圖像拆分成獨立的4個通道
>>> im_rgb = Image.merge("RGB",(r,g,b)) # 在按照需要合併成目標模式
>>> im_rgb.show()
>>> im = Image.open(r'D:\CSDN\Transp400.png')
>>> im.size # 查看圖像大小
(400, 400)
>>> im_100 = im.resize((100,100)) # 改變圖像大小(無需保持比例),返會新的Image對象
>>> im_100.size
(100, 100)
>>> im_100.show()
>>> im.thumbnail((128,128)) # 生成縮略圖,但不會返回新的Image對象,而是直接改變了原對象的大小
>>> im.show()
Image.rotate(angle, =0, expand=0, center=None, translate=None)
angle – 單位度(°),逆時針方向為正
resample – 可選的重採樣過濾器,選項:Image.NEAREST,Image.BILINEAR,Image.BICUBIC
expand – 可選的擴展標記。如果為真,則展開輸出圖像,使其足夠大以容納整個旋轉後的圖像。如果為假或省略,使輸出圖像的大小與輸入圖像相同。請注意,擴展標誌假定是圍繞中心旋轉的,沒有平移
center – 可選的旋轉中心(2元組),默認是圖像的中心
translate – 一個可選的旋轉後轉換(2元組)
>>> im = Image.open(r'D:\CSDN\Transp400.png')
>>> im_rotate = im.rotate(-50)
>>> im_rotate.show() # 下圖左是以圖片中心為基點順時針旋轉50度的效果
>>> im_rotate = im.rotate(-50, expand=True, center=(100,100), translate=(100,00))
>>> im_rotate.show() # 下圖右是以(100,100)為基點順時針旋轉50度後右移100像素的效果
>>> im_bg = Image.open(r'D:\CSDN\python_op.png')
>>> im_bg.size
(800, 404)
>>> im_bg.show()
>>> im = Image.open(r'D:\CSDN\Transp400.png')
>>> im.size
(400, 400)
>>> im_box = im.crop((50,50,250,250)) # 圖像裁切位置:左上(50,50),右下(250,250)
>>> im_box.size
(200, 200)
>>> im_copy = im_box.copy() # 圖像複製
>>> im_bg.paste(im_copy, (400,0)) # 圖像粘貼,位置(400,0)
>>> im_bg.paste(im, (0,0)) # 圖像粘貼,位置(0,0)
>>> im_bg.show()
BLUR
CONTOUR
DETAIL
EDGE_ENHANCE
EDGE_ENHANCE_MORE
EMBOSS
FIND_EDGES
SHARPEN
SMOOTH
SMOOTH_MORE
>>> im = Image.open(r'D:\CSDN\hello.jpg')
>>> im.show() # 下圖左上
>>> im.filter(ImageFilter.BLUR).show() # 下圖右上
>>> im.filter(ImageFilter.FIND_EDGES).show() # 下圖左下
>>> im.filter(ImageFilter.CONTOUR).show() # 下圖右下
>>> im_bg = Image.open(r'D:\CSDN\python_op.png')
>>> font = ImageFont.truetype("arial.ttf", 32)
>>> draw = ImageDraw.Draw(im_bg)
>>> draw.line((0, im.size[1], im.size[0], 0), fill=(255, 255, 255, 255)) # 繪製值線,[(x, y), (x, y), ...] or [x, y, x, y, ...]
>>> draw.arc([60,60,200,200], 0, 270, fill='red') # 繪製圓弧,box, start angle, end angle, fill color
>>> draw.rectangle([300,300,500,400], fill='red', outline='white') # 繪製矩形
>>> draw.point([60,60,62,60,64,60,66,60,68,60,70,60],fill='white') # 繪製點, [x, y, x, y, x, y]
>>> draw.text([400, 300], "Hello, world", font=font) # 繪製文字
>>> im_bg.show()
>>> im = ImageGrab.grab((1200,600,1920,1080)) # 截取屏幕範圍:左上角(1200,600),右下角(1920,1080)
>>> im.show()