书籍《Python编程快速上手(第2版)》阅读心得10、操作图像
[复制链接]
图像处理在日常工作中也是非常常见,Python也提供了处理图像的模块,但是不是python自带的模块,而是第三方模块,使用时需要进行手动安装。
这篇我们使用的模块是pillow,专门用来处理图像的的一个模块。
图像是有颜色的,用RGBA表示,R表示Red(范围0~255),G表示Green(范围0~255),B表示Blue(范围0~255),A表示alpha(透明度,范围0~255,0表示完全透明,255表示完全不透明)。
接下来,将用一些例子来说明图像的操作。
from PIL import Image
# 打开一张图片
img = Image.open('D:\\Python\\python.png')
# 打印图片尺寸
print(img.size)
# 打印文件名
print(img.filename)
# 打印图片格式
print(img.format)
# 打印文件格式的详细描述
print(img.format_description)
# 另存为python.jpg
img.save('D:\\Python\\python.jpg')
# 新建一张100*200的图片,颜色为purple
new_img = Image.new('RGBA', (100, 200), 'purple')
# 保存图片
new_img.save('D:\\Python\\purpleImage.png')
# 重新打开python.png
img = Image.open('D:\\Python\\python.png')
# 裁剪图片,从坐标(335, 345)到(565,560)
croppedImg = img.crop((335, 345, 565, 560))
# 保存裁剪的图片
croppedImg.save('D:\\Python\\croppedImage.png')
# 复制一张img保存在copyImg变量中
copyImg = img.copy()
# 将图片croppedImg粘贴到图片copyImg上,粘贴到坐标(0,0)
copyImg.paste(croppedImg, (0, 0))
# 将图片croppedImg粘贴到图片copyImg上,粘贴到坐标(100,100)
copyImg.paste(croppedImg, (100, 100))
# 保存图片
copyImg.save('D:\\Python\\pastedImage.png')
程序中,首先使用Image.open()方法开了一张本地的图片,文件对象为img,然后用img.size获取了图片的尺寸,还可以用img.filenam获取文件名,用img.format_description获取格式的详细信息,使用Image.new()方法新建图片。
接下来,使用img.crop()方法对图片进行了裁剪,然后将裁剪后的小图片粘贴到了原来的大的图片上。
原图:
裁剪后的图片:
粘贴后的图片:
除了图片的复制,粘贴,裁剪,新建,保存以外,pillow模块还可以调整图像的大小,旋转和翻转图片,更改单个像素。
来通过一个例子来看看,这些功能。
from PIL import Image
# 打开一张图片
img = Image.open('D:\\Python\\python.png')
# 获取图片的宽度和高度
width, height = img.size
# 打印图片尺寸
print(img.size)
# 将图片缩小为原来的1/4,并将生成一张新的图片
# resize不会更原来图像的尺寸,而是返回一个新的图片对象
quarterSizedImg = img.resize((int(width / 2), int(height / 2)))
# 打印新的图片尺寸
print(quarterSizedImg.size)
# 保存图片
quarterSizedImg.save('D:\\Python\\quarterSizedImg.png')
# 将img图片逆时针旋转90度,并另存为rotate90.png
# rotate也不会改变原来图片的方向,而是返回一个新的图片对象
# 旋转90度和270度会改变图像的宽度和高度,旋转其它角度宽度个高度保持不变。
# windows上使用黑色背景来填补旋转造成的缝隙
img.rotate(90).save('D:\\Python\\rotate90.png')
# 将img图片逆时针旋转180度,并另存为rotate180.png
# rotate也不会改变原来图片的方向,而是返回一个新的图片对象
img.rotate(180).save('D:\\Python\\rotate180.png')
# 将img图片逆时针旋转6度,并另存为rotate6.png
# rotate也不会改变原来图片的方向,而是返回一个新的图片对象
# windows上使用黑色背景来填补旋转造成的缝隙
img.rotate(6).save('D:\\Python\\rotate6.png')
# 水平镜像
img.transpose(Image.FLIP_LEFT_RIGHT).save('D:\\Python\\horizontal_flip.png')
# 垂直镜像
img.transpose(Image.FLIP_TOP_BOTTOM).save('D:\\Python\\vertical_flip.png')
程序中打开了一张图片,得到了图片的对象img,然后通过img.resize()方法将图片缩小为原来的四分之一,
然后再使用img.rotate()方法将图片旋转90度,270,和6度。其中90度和270度会改变图像的宽和高,其它角度不会改变图像的宽度和高度,但是windows上使用黑色背景来填补旋转造成的缝隙。img.transpose()方法可将图像进行水平镜像和垂直镜像。
缩小后的图片:
旋转90度的图片:
旋转6度后的图片,可以看到背景用黑色进行了填充:
除了以上这些操作,pillow模块还能在图像上进行绘画,比如绘制点,线,矩形等各种形状,绘制形状需要使用到pillow的ImageDraw模块。
还能绘制文本,通过ImageFont模块。
来看看怎么实现这些功能。
from PIL import Image, ImageDraw, ImageFont
# 新建一张图片,指定大小为200 * 200,白色背景
img = Image.new('RGBA', (200, 200), 'white')
# 定义一个draw对象,用户绘制形状
draw = ImageDraw.Draw(img)
# 画线,每个点都是线上的点
draw.line([(0,0), (150, 0), (150, 150),(0, 150), (0, 0)], fill='red')
# 画矩形
draw.rectangle((20, 30, 60, 60), fill='blue')
# 绘制文本
draw.text((20, 150), 'HELLO EEWORLD!', fill='purple')
# 保存
img.save('D:\\Python\\draw.png')
绘制完的图片如下:
通过draw.line()方法画了线条,通过draw.rectangle()方法画了矩形,通过draw.text()方法设置了文本“HELLO EEWORLD!”,其实还能设置文本的字体,我这里使用的是默认字体。
通过以上内容能看出了pillow模块还是非常强大的,我这里用到的可能只是该模块一些最常用的一些方法,应该还有更多的方法可以继续探索,有时间再详细了解其它有用的方法。
|