Python让繁琐工作自动化——chapter17 操作图像

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等错误,在这里的解决办法是,将该文件的绝对路径保存,打开时用这个绝对路径


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值