爬虫(十三):PIL模块
1. PIL模块
在爬虫(十二):图形验证码的识别、滑动验证码的识别(B站滑动验证码)中我留下了一个悬念,为什么安装的是pillow模块,而不是PIL模块。这是因为PIL是python2的产物,它并没有跟随python的发展而发展。所以有大佬为此特意写了一个针对python3的pillow模块。所以,如果需要安装python3对应的PIL,应该选择安装pillow。
1.1 导入Image模块
我们一般只使用PIL模块中的Image模块,所以我这就只讲解Image模块了。
安装PIL模块:
pip install pillow -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
导入模块:
from PIL import Image
1.2 Image模块常用方法
(1) 读取图片
open(url):读取一张图片,参数是图片名。
(2) 显示图片
show():显示一张图片。
案例:
from PIL import Image img = Image.open('xhh.jpg')
img.show()
结果:
(3) 保存图片
save(image,type):将图像保存为名称为“image”、格式为type格式的图片。
(4) 创建新图片
new(mode,size):创建一张模式为mode、大小为size的图片。
new(mode,size,color):创建一张模式为mode、大小为size、颜色为color的图片。
案例:
from PIL import Image newImg = Image.new("RGBA",(640,480),(255,0,0))
newImg.save("newImg.png","PNG")
结果:
(5) 两张图片相加
blend(img1,img2,alpha):将img1和img2,这里alpha表示img1和img2的比例参数
(6) 改变图像大小
resize(size):将图像修改为size大小
案例1:
from PIL import Image img1 = Image.open("xhh.jpg")
img2 = Image.open("xhh2.jpg")
#img = img1×0.8+img2×0.2
img = Image.blend(img1,img2,0.2)
img.show()
结果:
为什么会报错呢?因为他们的大小不一样,而这个报错在官方是没有解释的。
案例2:
from PIL import Image img1 = Image.open("xhh.jpg")
img1 = img1.resize((256,256))
img2 = Image.open("xhh2.jpg")
img2 = img2.resize((256,256))
#img = img1×0.7+img2×0.3
img = Image.blend(img1,img2,0.3)
img.show()
结果:
(7) 点操作
point(function):这个function接受一个参数,且对图片中的每一个点执行这个函数。
案例:
from PIL import Image img = Image.open("xhh.jpg")
img.show()
out=img.point(lambda i:i*1.5)#对每个点进行50%的加强
out.show()
这前后对比明显吧。
(8) 查看图像信息
from PIL import Image img = Image.open("xhh.jpg")
print(img.format)
print(img.size)
print(img.mode)
结果:
(9) 图片裁剪
crop(box):设置要裁剪的区域范围box。
案例:
from PIL import Image img = Image.open("xhh.jpg")
box=(100,100,500,500)
#设置要裁剪的区域
region=img.crop(box) #此时,region是一个新的图像对象。
region.show()
结果:
(10) 图像黏贴(合并)
paste(region,box):黏贴box大小的region图像到原来的图片对象中。
案例:
from PIL import Image img1 = Image.open("xhh.jpg")
img2 = Image.open("xhh2.jpg")
img1.paste(img2,(0,0))
img1.show()
结果:
(11) 通道分离
split():分割成三个通道,此时r,g,b分别为三个图像对象。
(12) 通道合并
merge("RGB",(b,g,r)):将b,r两个通道进行翻转。
案例:
from PIL import Image img1 = Image.open("xhh.jpg")
img1.show()
r, g, b = img1.split()
img2 = Image.merge("RGB", (b, g, r))
img2.show()
结果:
(13) 旋转图像
rotate(angle):逆时针旋转angle度。
(14) 图像转换
案例:
from PIL import Image img = Image.open("xhh.jpg")
#左右对换
out1 = img.transpose(Image.FLIP_LEFT_RIGHT)
out1.show()
#上下对换
out2 = img.transpose(Image.FLIP_TOP_BOTTOM)
out2.show()
结果:
(15) 图像类型转换
convert(mode):将图像转换成mode类型。
PIL的九种不同模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
常用的两种:
1.模式”1”
为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。下面我们将lena图像转换为“1”图像。
from PIL importImage
img = Image.open(“E:\image\myimg.jpg”)
img_1=img.convert(“1”)
2.模式“L”
为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:
L = R * 299/1000 + G * 587/1000+ B * 114/1000
(16) 获取某个像素位置的值
getpixel(coordinate):coordinate为(x,y)形式的值。
(17) 修改某个像素位置的值
putpixel(coordinate,color):修改像素位置coordinate的颜色color的值。
案例:
from PIL import Image img = Image.open("xhh.jpg") print(img.size)
print(img.getpixel((4, 4))) width = img.size[0] # 长度
height = img.size[1] # 宽度 for w in range(0, width):
for h in range(0, height):
data = img.getpixel((w, h)) # 得到像素值
if (data[0] <= 170 and data[1] <= 170 and data[2] <= 170):
img.putpixel((w, h), (0, 0, 255)) # 则这些像素点的颜色改成大红色 img.show()
结果:
最新文章
- [No000023]为何没有更多人从事程序员的工作?程序员常有,优秀程序员不常有!
- 3dmax导出3ds具有过多要导出的面超过64k解决方法
- JDO持久 (jdbc ejb)
- 用仿ActionScript的语法来编写html5——第九篇,仿URLLoader读取文件
- 修改linux 文件权限命令 chmod
- yum在线升级
- iOS-开发日志-UIButton
- xm学习笔记
- PHP学习笔记三十四【记录日志】
- POJ 3301 Texas Trip
- Oracle性能优化顺序表名称来选择最有效的学习笔记
- Java 环境设置
- 设计完美的策略模式,消除If-else
- 20175209 《Java程序设计》第二周学习总结
- python批量下载微信好友头像,微信头像批量下载
- 电力电子MATLAB
- docker push到私有仓库
- Notepad++ 中使用tail -f功能
- 理解IOC
- [UI] Article intro effects
热门文章
- Git 添加远程github仓库的时候提示错误:fatal: remote origin already exists.
- Auto.js的初次使用——在VSCode中使用
- es2.0的语法学习
- MySQL转译
- 【算法学习记录-排序题】【PAT A1016】Phone Bills
- python-PIL-16bit-灰度图像生成-tiff
- idea中使用Data Source and Drivers时,如果使用自己自定义的jar包
- Redis如果内存满了怎么办?
- docker容器 - 进入容器、删除容器
- SpringCloud 设置多个运行实例的端口号