深入剖析Python最强大图片处理模块--Pillow

Pillow作为一个图片模块。可谓是真的简便强大,它的前身是PIL,后来将他取代,现在的pillow 可谓是一家独大,好了,让我们来看看他的具体用法。

[[392972]]

Pillow作为一个图片模块。可谓是真的简便强大,它的前身是PIL,后来将他取代,现在的pillow 可谓是一家独大,好了,让我们来看看他的具体用法。

今天我们介绍pillow 常用六大模块:

1.Image

2.ImageDraw

3.ImageEnhance

4.ImageFont

5.ImageGrab

6.ImageFilter

一、Image

  1. from PIL import Image 
  2. from io import BytesIO 
  3. #读取一张图片 
  4. im=Image.open('2.jpg') #根据文件名读取图像 
  5. b=BytesIO() 
  6. im.save(b,'JPEG'
  7. data=b.getvalue() 
  8. print(data)#获取图片的二进制信息 
  9. #图片格式 
  10. print('格式:',im.format) 
  11. #图片模式 
  12. print('模式:',im.mode)  #L:灰度  RGB:真彩色 CMYK:出版图像 
  13. #图像宽高 
  14. print('宽高:',im.size
  15. print('完整信息:',im.info) 
  16. try: 
  17.     im.verify()#检查图像文件的完整性 
  18. except
  19.     pass 
  20. finally: 
  21.     im.show() #显示一张图片 
  22.     im.save('4.jpg','JPEG') #保存图片 
  1. from PIL import Image 
  2. from io import BytesIO 
  3. import requests 
  4. #创建新图片: 
  5. im1=Image.new('RGBA',(400,400),'red'
  6. #从二进制中读取图片 
  7. res=requests.get('http://pic.sc.chinaz.com/files/pic/pic9/202003/zzpic24077.jpg').content 
  8. im2=Image.frombytes('RGB',(100,100),data=res)#只能解析纯二进制图片 
  9. #从网页中读取图片 
  10. im2=Image.open(BytesIO(res)) 
  11. b=BytesIO() 
  12. im2.save(b,format="PNG"
  13. im2.show() 
  14.  
  15. #两张图片相加: 
  16. im1=Image.new('RGBA',(400,400),'red'
  17. im2=Image.new('RGBA',(400,400),'blue'
  18. Image.blend(im1,im2,0.5) #两个图片大小一定要一样(效果见图4) 
  19.  
  20. #点操作: 
  21. im1.point(lambda x:x*1.2) 
  22.  
  23.  
  24. #图片裁剪: 
  25. box=(100,100,200,200) 
  26. region=im.crop(box)#设置要裁剪的区域 
  27.  
  28. #图片粘贴(合并) 
  29. im1.paste(region,box)#粘贴box大小的region到原先的图片对象中。(见图5) 
  30.  
  31.  
  32. im1=Image.new('RGB',(400,400),'red'
  33. im2=Image.new('RGBA',(400,400),'blue'
  34.  
  35. #通道分离: 
  36. r,g,b=im1.split()#分割成三个通道,此时r,g,b分别为三个图像对象。 
  37. print(r,g,b) 
  38. #通道合并: 
  39. im3=Image.merge("RGB",(b,g,r))#将b,r两个通道进行翻转。 
  40.  
  41.  
  42. #改变图片的大小: 
  43. im4=im1.resize((300,200)) 
  44. im4.show() 
  45.  
  46.  
  47. #图片翻转 
  48. im5=im1.transpose(Image.FLIP_LEFT_RIGHT)  #左右翻转 
  49. im6=im2.transpose(Image.FLIP_TOP_BOTTOM)  #上下翻转 
  50. im5.show() 
  51. im6.show() 
  52.  
  53.  
  54. #获取某个像素位置的值 
  55. im1.getpixel((43,23)) 
  56.  
  57.  
  58. #写某个像素位置的值 
  59. im1.putpixel((10,20),(255,32,43)) 
  60.  
  61.  
  62. #创建图像缩略图 
  63. im1.thumbnail((10,20))#图片大小为(10,20) 
  64. im1.show() 
  65.  
  66. #旋转图像 
  67. im8=im1.rotate(45) #逆时针旋转45度 
  68. im8.show() 
  69. 注:RGB有三个通道,RGBA有四个通道,以上图片显示效果都在图6中 
  70.  
  71.  
  72. #图片模式转换 
  73. im3.convert('RGBA'
  74. modes       Description 
  75.  1      1位像素,黑白图像,存成8位像素 
  76.  L      8位像素,黑白 
  77.  P      9位像素,使用调色板映射到任何其他模式 
  78. RGB     3*8位像素,真彩 
  79. RGBA4*8位像素,真彩+透明通道 
  80. CMYK4*8位像素,印刷四色模式或彩色印刷模式 
  81. YCbCr3*8位像素,色彩视频格式 
  82.  I      32位整型像素 
  83.  F      33位浮点型像素 

二、ImageDraw

这个模块主要就是画图和打水印时用的,具体方法请看下面:

  1. from PIL import Image,ImageDraw 
  2. #画点 
  3. im=Image.open('2.jpg'
  4. draw= ImageDraw.Draw(im) 
  5. draw.point([100,200],fill='blue')#指定点的坐标和颜色 
  6.  
  7.  
  8. # 创建一个正方形。[x1,x2,y1,y2]或者[(x1,x2),(y1,y2)]  fill代表的为颜色 
  9. draw.line([100,100,100,600],fill='pink')#直线 
  10. draw.line([100,100,600,100],fill='green'
  11. draw.line([600,100,600,600],'black'
  12. draw.line([100,600,600,600],'blue'
  13.  
  14.  
  15.  
  16. # 弧形 [x1,x2,y1,y2]  弧度 颜色 
  17. draw.arc([100,100,600,600],0,360,fill='black'
  18. draw.arc([200,100,500,600],0,360,fill='yellow'
  19.  
  20.  
  21. # 画圆  [x1,x2,y1,y2] outline边框颜色 fill填充颜色 
  22. draw.ellipse([100,100,600,600],outline='black',fill='white'
  23.  
  24.  
  25. # 画半圆 [x1,x2,y1,y2]  弧度 outline弦线颜色 fill填充颜色 
  26. draw.chord([100,100,600,600],0,360,outline=125) 
  27. draw.chord([100,100,600,600],0,90,outline=158) 
  28. draw.chord([100,100,600,600],90,180,outline=99,fill='gray'
  29.  
  30.  
  31.  
  32. # 扇形 [x1,x2,y1,y2]  弧度 outline弦线颜色 fill填充颜色 
  33. draw.pieslice([100,100,600,600],180,210,outline=255) 
  34. draw.pieslice([100,100,600,600],30,80,fill=255) 
  35.  
  36.  
  37.  
  38. # 多边形 
  39. draw.polygon([10,23,45,6,77,87],outline='orange'
  40. draw.polygon([10,20,30,40,50,90,70,80,90,100],fill='red'
  41.  
  42.  
  43. # 矩形 
  44. draw.rectangle((200,200,500,500),outline = "white"
  45. draw.rectangle((250,300,450,400),fill = 128) 
  46.  
  47.  
  48. # 文字 
  49. text = 'hello world ' 
  50. # 颜色 
  51. draw.ink = 0 + 0 * 256 + 255 * 256 * 256 
  52. # 加载到图片上 
  53. draw.text([200,100],text) 
  54. im.show() 

这里每个图形基本都一览无余,如果你的图片像素太小的话,所绘制的图形是不会完整显示在上面的。

三、ImageEnhance

主要是设置图片的颜色对比度亮度锐度啥的,增强图像。

  1. from PIL import  ImageEnhance        
  2. im1=Image.open('4.jpg')    
  3. #调整图像的颜色平衡 
  4. cl=ImageEnhance.Color(im1) 
  5. ce=cl.enhance(1.2)#对选择的属性数值增强1.3倍 
  6. ce.show() 
  7. #调整图像的对比度 
  8. ct=ImageEnhance.Contrast(im1) 
  9. ch=ct.enhance(3.4) 
  10. ch.show() 
  11. #调整图像的亮度 
  12. br=ImageEnhance.Brightness(im1) 
  13. be=br.enhance(2.2) 
  14. be.show() 
  15. #调整图像的锐度 
  16. sp=ImageEnhance.Sharpness(im1) 
  17. se=sp.enhance(200) 
  18. se.show() 

四、ImageFont

字体模块,主要是读取系统内字体以及给图片添加水印效果

  1. from PIL import Image 
  2. from PIL import ImageDraw 
  3. from PIL import ImageFont 
  4. font=ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',size=40) 
  5. im=Image.open('4.jpg'
  6. dw=ImageDraw.Draw(im) 
  7. dw.text((50,60),'你好,world',fill='red',font=font) 
  8. im.show() 

五、ImageGrab

  1. from PIL import ImageGrab  
  2. im1=ImageGrab.grab((0,0,800,200)) #截取屏幕指定区域的图像  
  3. im2=ImageGrab.grab() #不带参数表示全屏幕截图 
  4. im1.show() 
  5. im2.show() 

六、ImageFilter

过滤图像的效果。

  1. from PIL import Image, ImageFilter  
  2. im = Image.open('4.jpg')  
  3. # 高斯模糊  
  4. im1=im.filter(ImageFilter.GaussianBlur)  
  5. im1.show() 
  6. # 普通模糊  
  7. im2=im.filter(ImageFilter.BLUR)  
  8. im2.show() 
  9. # 边缘增强  
  10. im3=im.filter(ImageFilter.EDGE_ENHANCE)  
  11. im3.show() 
  12. # 找到边缘  
  13. im4=im.filter(ImageFilter.FIND_EDGES)  
  14. im4.show() 
  15. # 浮雕  
  16. im5=im.filter(ImageFilter.EMBOSS)  
  17. im5.show() 
  18. # 轮廓  
  19. im6=im.filter(ImageFilter.CONTOUR)  
  20. im6.show() 
  21. # 锐化  
  22. im7=im.filter(ImageFilter.SHARPEN)  
  23. im7.show() 
  24. # 平滑  
  25. im8=im.filter(ImageFilter.SMOOTH)  
  26. im8.show() 
  27. #阙值平滑 
  28. im9=im.filter(ImageFilter.SMOOTH_MORE)  
  29. im9.show() 
  30. # 细节  
  31. im10=im.filter(ImageFilter.DETAIL) 
  32. im10.show() 

pillow 还算是比较强大的一个 模块,他可以轻松实现截屏 水印效果,并且还可以制作字符画,下面请看:

  1. from PIL import Image 
  2. from PIL import ImageDraw 
  3. from PIL import ImageFont 
  4. txt = 'meimei' 
  5. font = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc',9)  #9为字体大小 
  6. im_path = '1.jpg'  #原图路径 
  7. im = Image.open(im_path) 
  8. width, height = im.size  
  9. newImg = Image.new("RGBA",(width, height),(10,10,10))  #背景色rgb,偏黑显示好一些 
  10. x=0 
  11. for i in range(0,height,9):   #需要与字体大小一致 
  12.     for j in range(0,width,9): #需要与字体大小一致 
  13.         a,b,c=im.getpixel((j,i)) #获取像素 
  14.         draw = ImageDraw.Draw(newImg) 
  15.         draw.text( (j,i), (txt[x%(len(txt)):x%(len(txt))+3]), fill=(a,b,c),font=font) 
  16.         x+=3 
  17.         del draw 
  18. newImg.save('00.png','PNG'

通过对Pillow的学习,相信你现在已经能玩转图片的各种骚操作了,配合词云的话就能生成更具特色的图片了。