深入剖析Python最強大圖片處理模塊--Pillow
前言
Pillow作為一個圖片模塊。可謂是真的簡便強大,它的前身是PIL,后來將他取代,現(xiàn)在的pillow 可謂是一家獨大,好了,讓我們來看看他的具體用法。
今天我們介紹pillow 常用六大模塊:
1.Image
2.ImageDraw
3.ImageEnhance
4.ImageFont
5.ImageGrab
6.ImageFilter
一、Image
- from PIL import Image
 - from io import BytesIO
 - #讀取一張圖片
 - im=Image.open('2.jpg') #根據(jù)文件名讀取圖像
 - b=BytesIO()
 - im.save(b,'JPEG')
 - data=b.getvalue()
 - print(data)#獲取圖片的二進制信息
 - #圖片格式
 - print('格式:',im.format)
 - #圖片模式
 - print('模式:',im.mode) #L:灰度 RGB:真彩色 CMYK:出版圖像
 - #圖像寬高
 - print('寬高:',im.size)
 - print('完整信息:',im.info)
 - try:
 - im.verify()#檢查圖像文件的完整性
 - except:
 - pass
 - finally:
 - im.show() #顯示一張圖片
 - im.save('4.jpg','JPEG') #保存圖片
 
- from PIL import Image
 - from io import BytesIO
 - import requests
 - #創(chuàng)建新圖片:
 - im1=Image.new('RGBA',(400,400),'red')
 - #從二進制中讀取圖片
 - res=requests.get('http://pic.sc.chinaz.com/files/pic/pic9/202003/zzpic24077.jpg').content
 - im2=Image.frombytes('RGB',(100,100),data=res)#只能解析純二進制圖片
 - #從網(wǎng)頁中讀取圖片
 - im2=Image.open(BytesIO(res))
 - b=BytesIO()
 - im2.save(b,format="PNG")
 - im2.show()
 - #兩張圖片相加:
 - im1=Image.new('RGBA',(400,400),'red')
 - im2=Image.new('RGBA',(400,400),'blue')
 - Image.blend(im1,im2,0.5) #兩個圖片大小一定要一樣(效果見圖4)
 - #點操作:
 - im1.point(lambda x:x*1.2)
 - #圖片裁剪:
 - box=(100,100,200,200)
 - region=im.crop(box)#設(shè)置要裁剪的區(qū)域
 - #圖片粘貼(合并)
 - im1.paste(region,box)#粘貼box大小的region到原先的圖片對象中。(見圖5)
 - im1=Image.new('RGB',(400,400),'red')
 - im2=Image.new('RGBA',(400,400),'blue')
 - #通道分離:
 - r,g,b=im1.split()#分割成三個通道,此時r,g,b分別為三個圖像對象。
 - print(r,g,b)
 - #通道合并:
 - im3=Image.merge("RGB",(b,g,r))#將b,r兩個通道進行翻轉(zhuǎn)。
 - #改變圖片的大?。?nbsp;
 - im4=im1.resize((300,200))
 - im4.show()
 - #圖片翻轉(zhuǎn)
 - im5=im1.transpose(Image.FLIP_LEFT_RIGHT) #左右翻轉(zhuǎn)
 - im6=im2.transpose(Image.FLIP_TOP_BOTTOM) #上下翻轉(zhuǎn)
 - im5.show()
 - im6.show()
 - #獲取某個像素位置的值
 - im1.getpixel((43,23))
 - #寫某個像素位置的值
 - im1.putpixel((10,20),(255,32,43))
 - #創(chuàng)建圖像縮略圖
 - im1.thumbnail((10,20))#圖片大小為(10,20)
 - im1.show()
 - #旋轉(zhuǎn)圖像
 - im8=im1.rotate(45) #逆時針旋轉(zhuǎn)45度
 - im8.show()
 - 注:RGB有三個通道,RGBA有四個通道,以上圖片顯示效果都在圖6中
 - #圖片模式轉(zhuǎn)換
 - im3.convert('RGBA')
 - modes Description
 - 1 1位像素,黑白圖像,存成8位像素
 - L 8位像素,黑白
 - P 9位像素,使用調(diào)色板映射到任何其他模式
 - RGB 3*8位像素,真彩
 - RGBA4*8位像素,真彩+透明通道
 - CMYK4*8位像素,印刷四色模式或彩色印刷模式
 - YCbCr3*8位像素,色彩視頻格式
 - I 32位整型像素
 - F 33位浮點型像素
 
二、ImageDraw
這個模塊主要就是畫圖和打水印時用的,具體方法請看下面:
- from PIL import Image,ImageDraw
 - #畫點
 - im=Image.open('2.jpg')
 - draw= ImageDraw.Draw(im)
 - draw.point([100,200],fill='blue')#指定點的坐標(biāo)和顏色
 - # 創(chuàng)建一個正方形。[x1,x2,y1,y2]或者[(x1,x2),(y1,y2)] fill代表的為顏色
 - draw.line([100,100,100,600],fill='pink')#直線
 - draw.line([100,100,600,100],fill='green')
 - draw.line([600,100,600,600],'black')
 - draw.line([100,600,600,600],'blue')
 - # 弧形 [x1,x2,y1,y2] 弧度 顏色
 - draw.arc([100,100,600,600],0,360,fill='black')
 - draw.arc([200,100,500,600],0,360,fill='yellow')
 - # 畫圓 [x1,x2,y1,y2] outline邊框顏色 fill填充顏色
 - draw.ellipse([100,100,600,600],outline='black',fill='white')
 - # 畫半圓 [x1,x2,y1,y2] 弧度 outline弦線顏色 fill填充顏色
 - draw.chord([100,100,600,600],0,360,outline=125)
 - draw.chord([100,100,600,600],0,90,outline=158)
 - draw.chord([100,100,600,600],90,180,outline=99,fill='gray')
 - # 扇形 [x1,x2,y1,y2] 弧度 outline弦線顏色 fill填充顏色
 - draw.pieslice([100,100,600,600],180,210,outline=255)
 - draw.pieslice([100,100,600,600],30,80,fill=255)
 - # 多邊形
 - draw.polygon([10,23,45,6,77,87],outline='orange')
 - draw.polygon([10,20,30,40,50,90,70,80,90,100],fill='red')
 - # 矩形
 - draw.rectangle((200,200,500,500),outline = "white")
 - draw.rectangle((250,300,450,400),fill = 128)
 - # 文字
 - text = 'hello world '
 - # 顏色
 - draw.ink = 0 + 0 * 256 + 255 * 256 * 256
 - # 加載到圖片上
 - draw.text([200,100],text)
 - im.show()
 
這里每個圖形基本都一覽無余,如果你的圖片像素太小的話,所繪制的圖形是不會完整顯示在上面的。
三、ImageEnhance
主要是設(shè)置圖片的顏色對比度亮度銳度啥的,增強圖像。
- from PIL import ImageEnhance
 - im1=Image.open('4.jpg')
 - #調(diào)整圖像的顏色平衡
 - cl=ImageEnhance.Color(im1)
 - ce=cl.enhance(1.2)#對選擇的屬性數(shù)值增強1.3倍
 - ce.show()
 - #調(diào)整圖像的對比度
 - ct=ImageEnhance.Contrast(im1)
 - ch=ct.enhance(3.4)
 - ch.show()
 - #調(diào)整圖像的亮度
 - br=ImageEnhance.Brightness(im1)
 - be=br.enhance(2.2)
 - be.show()
 - #調(diào)整圖像的銳度
 - sp=ImageEnhance.Sharpness(im1)
 - se=sp.enhance(200)
 - se.show()
 
四、ImageFont
字體模塊,主要是讀取系統(tǒng)內(nèi)字體以及給圖片添加水印效果
- from PIL import Image
 - from PIL import ImageDraw
 - from PIL import ImageFont
 - font=ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',size=40)
 - im=Image.open('4.jpg')
 - dw=ImageDraw.Draw(im)
 - dw.text((50,60),'你好,world',fill='red',font=font)
 - im.show()
 
五、ImageGrab
- from PIL import ImageGrab
 - im1=ImageGrab.grab((0,0,800,200)) #截取屏幕指定區(qū)域的圖像
 - im2=ImageGrab.grab() #不帶參數(shù)表示全屏幕截圖
 - im1.show()
 - im2.show()
 
六、ImageFilter
過濾圖像的效果。
- from PIL import Image, ImageFilter
 - im = Image.open('4.jpg')
 - # 高斯模糊
 - im1=im.filter(ImageFilter.GaussianBlur)
 - im1.show()
 - # 普通模糊
 - im2=im.filter(ImageFilter.BLUR)
 - im2.show()
 - # 邊緣增強
 - im3=im.filter(ImageFilter.EDGE_ENHANCE)
 - im3.show()
 - # 找到邊緣
 - im4=im.filter(ImageFilter.FIND_EDGES)
 - im4.show()
 - # 浮雕
 - im5=im.filter(ImageFilter.EMBOSS)
 - im5.show()
 - # 輪廓
 - im6=im.filter(ImageFilter.CONTOUR)
 - im6.show()
 - # 銳化
 - im7=im.filter(ImageFilter.SHARPEN)
 - im7.show()
 - # 平滑
 - im8=im.filter(ImageFilter.SMOOTH)
 - im8.show()
 - #闕值平滑
 - im9=im.filter(ImageFilter.SMOOTH_MORE)
 - im9.show()
 - # 細節(jié)
 - im10=im.filter(ImageFilter.DETAIL)
 - im10.show()
 
pillow 還算是比較強大的一個 模塊,他可以輕松實現(xiàn)截屏 水印效果,并且還可以制作字符畫,下面請看:
- from PIL import Image
 - from PIL import ImageDraw
 - from PIL import ImageFont
 - txt = 'meimei'
 - font = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',9) #9為字體大小
 - im_path = '1.jpg' #原圖路徑
 - im = Image.open(im_path)
 - width, height = im.size
 - newImg = Image.new("RGBA",(width, height),(10,10,10)) #背景色rgb,偏黑顯示好一些
 - x=0
 - for i in range(0,height,9): #需要與字體大小一致
 - for j in range(0,width,9): #需要與字體大小一致
 - a,b,c=im.getpixel((j,i)) #獲取像素
 - draw = ImageDraw.Draw(newImg)
 - draw.text( (j,i), (txt[x%(len(txt)):x%(len(txt))+3]), fill=(a,b,c),font=font)
 - x+=3
 - del draw
 - newImg.save('00.png','PNG')
 
七、總結(jié)
通過對Pillow的學(xué)習(xí),相信你現(xiàn)在已經(jīng)能玩轉(zhuǎn)圖片的各種騷操作了,配合詞云的話就能生成更具特色的圖片了。


























 
 
 


 
 
 
 