1. 基础语法
(1) 导入模块
from PIL import Image
(2)处理Image数据类型
catlmg = Image.open('zophie.png') #Image.open 函数返回一个Image数据对象
width, height = catImg.size #im.size 函数返回两个值,宽和高(size函数没有‘()’调用!)
im = Image.new('RGBA',(200,200),'white') #Image.new函数新建一个图像,参数含义(颜色模式,图像大小(元组表示),背景色)
faceim = catlmg2.crop((335,345,565,560)) #crop函数裁切图像并返回一个新的Image对象,矩形元组(左[,上[,右),下))
catlmg2 = catlmg.copy() #copy函数复制图像,返回一个新对象
catlmg2.paste(faceim,(left,top)) #paste函数将faceim 粘贴到 catImg2对象上,参数(‘源’Image对象,包含x和y的元组(指明主对象左上角)
im = im.resize((width,height)) #调整大小,在原Image对象上调用
afterimg.rotate(6,expand = True).save('rotateimg.jpg') #旋转对象返回一个新对象,(旋转角度,expand设置为True→调整整个尺寸以适应旋转后的新图像)
im.getpixel((x,y)) #获得单个像素的颜色值
im.putpixel((x,y),(R,G,B)) #对单个元素进行上色
(3)在图像上绘画
from PIL import Image,ImageDraw,ImageFont #ImageDraw模块为绘画模块,ImageFont模块为字体模块
im = Image.new('RGBA',(200,200),'white') #创建新的对象
draw = ImageDraw.Draw(im) #将Image对象传入ImageDraw对象
draw.line([(0,0),(199,0),(199,199),(0,199),(0,0)],fill='black',width = 1) #线(位置列表,填色,线宽)
draw.rectangle((20,30,60,60),fill='blue',outline=‘red’) #矩形(顶点元组,填色,轮廓颜色)
draw.ellipse((20,50,40,80),fill='red',outline=‘red’) #椭圆(包含该椭圆的矩形顶点,填色,轮廓颜色)
draw.polygon(((57,80),(50,48),(12,23),(120,90),(103,113)),fill='green') #多边形(顶点元组,填色,轮廓颜色)
draw.text((100,120),'Hello',fill='purple') #draw.text方法绘制文本(位置元组,文本内容,字体颜色)
arialFont = ImageFont.truetype('Arial.ttf',32) #ImageFont对象,用于设置文本的字体和大小
draw.text((100,150),'Howdy',fill='green',font=arialFont)
2. 实例应用
2.1 添加徽标
对目标文件夹中的所有照片添加水印,检查当前照片规格是否为规定大小,若是,将宽/高中较大的一个改为规定尺寸,另一个参数按比例缩小,将改变的图像 存入另一个文件夹。
# 2018/3/30 0030 20:14 #添加徽标,检查宽度和高度是否高于300,若是,将较大的一个猜到300 ,在按比例缩放,
from PIL import Image
import os
LOGONAME = 'catlogo.png'
logo_file = Image.open(LOGONAME) #打开水印图片
logowidth,logoheight = logo_file.size #获得水印图片尺寸
FIT_SIZE = 300 #规定大小
os.makedirs('withlogo',exist_ok = True) #exist_ok = True检查是否该文件夹已经存在
for file in os.listdir('.'): #遍历当前文件夹,不是图片的继续找下一个文件
if not file.endswith('.png') or file.endswith('.jpg') or file ==LOGONAME:
continue
im = Image.open(file)
width, height = im.size
print(width,height)
if width > FIT_SIZE and height > FIT_SIZE: #判断当前图片是否符合要求,不符合则重新调整
if width > height:
height = int ((FIT_SIZE / width)*height)
width = FIT_SIZE
else:
width = int(( FIT_SIZE / height)*width)
height = FIT_SIZE
print("Resizing ....%s"%file)
im = im.resize((width,height))
# print("The size of the pic is %s"%(im.size))
print("Adding logo to %s.."%file)
im.paste(logo_file,(width-logowidth, height-logoheight),logo_file) #将水印复制到目标照片,若没写第三个参数透明像素将变为白色
im.save(os.path.join('withlogo',file))
3. 课后习题
3.1 识别照片文件夹
定义照片文件夹:假定超过半数文件是照片的任何文件夹,且照片尺寸大于一定规格
# 2018/4/3 0003 17:05
#查询指定文件夹是否为照片文件夹:照片数量大于非照片数量,且照片大于一定规格
from PIL import Image
import os
SIZE = 100 #规定长宽
photodir = []
for foldername , subfolder , filenames in os.walk('D:\\pycharm'):
numphotofile = 0
numnotphoto = 0
for file in filenames:
#print("Checking....%s"%file)
if not str(file).endswith('.png') or str(file).endswith('.jpg'): #不是要求的jpg/png格式,继续找下一个
numnotphoto +=1
continue
folderpath = os.path.abspath(foldername) #文件的绝对路径
filepath = os.path.join(folderpath,file) #将照片和文件路径结合→照片的绝对路径
im = Image.open(filepath) #安全打开照片文件
width , height = im.size
if width >=SIZE and height >=SIZE:
numphotofile += 1
else:
numnotphoto += 1
if numnotphoto<numphotofile:
#print("This is a photo folder ")
photodir.append(foldername) #将该照片文件夹添加到列表
#print(foldername)
for i in photodir: #输出照片文件夹位置
print(i)
3.2 定制的座位卡
将纯文本文件的客人名单创建定制的邀请函,为客人创建定制的座位卡图像
# 2018/4/3 0003 17:55
#定制的座位卡
from PIL import Image,ImageDraw,ImageFont
import os
#将客人名字输出
os.makedirs('guset_seat',exist_ok=True)
guests = open('guests.txt','r')
pic = Image.open('draw_pic.png')
for guestname in guests.readlines():
guestname = guestname.strip() #将每个名字脱去‘\n’
#创建图像288*360
im = Image.new('RGBA',(288,360),'white')
im.paste(pic,(0,0),pic)
draw = ImageDraw.Draw(im)
draw.line([(0,0),(287,0),(287,359),(0,359),(0,0)], fill='black')
draw.text((144,220),guestname,fill='blue')
filename = guestname+'.png' #客人名字命名文件
im.save(os.path.join('guset_seat',filename))
注意:
(1)在对图像的尺寸传参时,以元组数据类型传入,(左,上,右,下)前两个为闭区间即包含当前位置,后两个为开区间即不包含当前位置。
(2)在打开照片时,常出现FileNotFound等错误,在这里的解决办法是,将该文件的绝对路径保存,打开时用这个绝对路径