Python编程让繁琐的工作自动化(1)-操作图像

在研究生生活中,帮老师干过的简单或复杂的工作不少,这其中,尤其是重复性的文件整理的工作让人烦躁不堪。后来在学习了python之后,发现很多东西都可以让电脑自动帮你去做,比如说几十个文件重命名,几十份材料合并在一起等。这些劳动虽然简单但是重复,非常消磨人的毅力,作为新时代的青年怎么可以把时间浪费到这些地方呢!所以,自己在网上找了些资料,完成过一些批量命名等的工作,主要是利用python以及windows的批处理。在某一天,我在图书馆借阅其他书籍时,突然发现了一本书《Python编程快速上手-让繁琐工作自动化》,稍微翻阅了一下发现和我平常遇到的问题非常相似。并且,作者通过十几章的内容介绍了非常行之有效的方法来解决这些繁杂的问题,不仅可以解放双手,还能有一丝小得意。这让我爱不释手。于是,希望通过Python编程让繁琐的工作自动化的博文来记录一下这些技巧。
因为内容较多,为了实用性和快速性,我便摘抄书上的例子来介绍,然后最后列出使用的函数的方式来总结每一部分的内容。

操作图像

计算机程序用RGBA表示图像中的颜色,A表示透明度alpha。如果A为0,则不论RGB为多少都不可见。

标准颜色名称及其 RGB 值

White (255, 255, 255, 255)
Red (255, 0, 0, 255)
Green (0, 128, 0, 255)
Blue (0, 0, 255, 255)
Gray (128, 128, 128, 255)
Yellow (255, 255, 0, 255)
Black (0, 0, 0, 255)
Purple (128, 0, 128, 255)

常用操作:

ImageColor.getcolor('RED', 'RGBA')-> #返回RGBA元组

from PIL import Image#Pillow的模块名称是PIL,这保持与老模块Python Imaging Library向后兼容,这就是为什么必须from PIL import Image。
catIm = Image.open('zophie.png') ->#返回 Image对象

#获取图像的各种信息
width, height = catIm.size
catIm.filename 
catIm.format
catIm.format_description
#保存文件
catIm.save('zophie.jpg') 
#创建空白图像
im = Image.new('RGBA', (100, 200), 'purple')
#裁剪图片,矩形元组区域(X1,Y1,X2,Y2)
croppedIm = catIm.crop((335, 345, 565, 560))
#复制和粘贴图像
catIm = Image.open('zophie.png') 
catCopyIm = catIm.copy() 
#如果要粘贴图像有透明像素,就将该图像作为第三个参数传入,就不会粘贴一个
#不透明的矩形,这就是“遮罩对象”
catCopyIm.paste(faceIm, (0, 0))#pillow不会使用计算机的剪贴板
#调整图像大小
width, height = catIm.size 
quartersizedIm = catIm.resize((int(width / 2), int(height / 2))) #返回一个新的对象,不会修改原对象
#旋转和翻转图像,旋转其他角度,图像原始尺寸会保存,windows会用黑色背景填#充,OS X会用透明像素填补,通过可选参数expand可以设置是否放大尺寸。
catIm.rotate(90).save('rotated90.png') 
catIm.rotate(6).save('rotated6.png') 
catIm.rotate(6, expand=True).save('rotated6_expanded.png') 
#镜像翻转
catIm.transpose(Image.FLIP_LEFT_RIGHT).save('horizontal_flip.png') 
catIm.transpose(Image.FLIP_TOP_BOTTOM).save('vertical_flip.png') 
#更改单个像素
im = Image.new('RGBA', (100, 100)) 
im.getpixel((0, 0)) 
im.putpixel((x, y), (210, 210, 210)) 

项目1:添加徽标

假设你有一项无聊的工作,要调整数千张图片的大小,并在每张图片的角上增
加一个小徽标水印。使用基本的图形程序,如 Paintbrush 或 Paint,完成这项工作需
要很长时间。像 Photoshop 这样神奇的应用程序可以批量处理,但这个软件要花几
百美元。让我们写一个脚本来完成工作。
假定图 17-11 是要添加到每个图像右下角的标识:带有白色边框的黑猫图标,
图像的其余部分是透明的。
Python编程让繁琐的工作自动化(1)-操作图像_第1张图片
总的来说,程序应该完成下面的事:
• 载入徽标图像。
• 循环遍历工作目标中的所有.png 和.jpg 文件。
• 检查图片是否宽于或高于 300 像素。
• 如果是,将宽度或高度中较大的一个减小为 300 像素,并按比例缩小的另一维度。
• 在角上粘贴徽标图像。
• 将改变的图像存入另一个文件夹。 这意味着代码需要做到以下几点:
• 打开 catlogo.png 文件作为 Image 对象。
• 循环遍历 os.listdir(’.’)返回的字符串。
• 通过 size 属性取得图像的宽度和高度。
• 计算调整后图像的新高度和宽度。
• 调用 resize()方法来调整图像大小。
• 调用 paste()方法来粘贴徽标。
• 调用 save()方法保存更改,使用原来的文件名。

针对这个项目,打开一个新的文件编辑器窗口,输入以下代码,并保存为
resizeAndAddLogo.py:

#! python3
# resizeAndAddLogo.py -resizes all images in current working directory to fit in a 300*300
# square, and adds catlogo.png to the lower-right corner.

import os
from PIL import Image

#第1步:打开徽标图像
#在这里修改参数
SQUARE_FIT_SIZE = 300
LOGO_FILENAME = 'catlogo.png'

logoIm = Image.open(LOGO_FILENAME)
logoWidth, logoHeight = logoIm.size

#第2步:遍历所有文件并打开图像

os.makedirs('withlog', exist_ok = True)
#遍历工作目录的所有文件
for filename in os.listdir('.'):
    if not (filename.endswith('.png') or filename.endswith('.jpg')) \
       or filename == LOGO_FILENAME:
        continue   #跳过非图像文件和图标本身
    
    im = Image.open(filename)
    width, height = im.size
#第3步:调整图像的大小
    if width > SQUARE_FIT_SIZE and height > SQUARE_FIT_SIZE:
        #计算需要调整的新的大小
        if width > height:
            height = int((SQUARE_FIT_SIZE / width) * height)
            width = SQUARE_FIT_SIZE
        else:
            width = int((SQUARE_FIT_SIZE / height) * width)
            height = SQUARE_FIT_SIZE
        #调整尺寸
        print('Resizing %s...' % (filename))
        im = im.resize(width, height)
#第4步:添加徽标,并保存更改
    print('Adding logo to %s...' % (filename))
    #注意,该条语句需要加第三个参数,否则不会粘贴透明元素
    im.paste(logoIm, (width-logoWidth, height-logoHeight), logoIm)
    #保存修改
    im.save(os.path.join('withlogo', filename))

能够批量合成图像或修改图像大小,在许多应用中都有用。可以编写类似的程
序,完成以下任务:
• 为图像添加文字或网站 URL。
• 为图像添加时间戳。
• 根据图像的大小,将图像复制或移动到不同的文件夹中。
• 为图像添加一个几乎透明的水印,防止他人复制。

项目2:添加文字

通过利用Pillow的ImageDraw模块,可以在图像上画线、矩形等其他形状以及添加文字。

from PIL import Image, ImageDraw
#创建一个新的图像
im = Image.new('RGBA', (200,200), 'white')
#将图像传给ImageDraw模块,得到一个ImageDraw对象
draw = ImageDraw.Draw(im)

#画简单几何图形
draw.line([(0, 0), (199, 0), (199, 199), (0, 199), (0, 0)], fill='black') 
draw.rectangle((20, 30, 60, 60), fill='blue') 
draw.ellipse((120, 30, 160, 60), fill='red') 
draw.polygon(((57, 87), (79, 62), (94, 85), (120, 90), (103, 113)), 
fill='brown') 
for i in range(100, 200, 10): 
    draw.line([(i, 0), (200, i - 100)], fill='green') 
#绘制文本
FONT_FOLDER = 'Library/Fonts'#这是OS X的目录
from PIL import ImageFont
draw.text((20, 150), 'Hello', fill='purple') 
fontsFolder = 'FONT_FOLDER'
#truetype()的第一个参数是字符串,表示字体的TrueType文件,这是硬盘上实际的字体文件,#TrueType字体文件具有.TTF文件扩展名,通常在以下文件夹中找到:C:\Windows\Fonts找到
#第二个参数表示字体大小,Pillow创建的PNG图像默认为72ppi(pixels per inch)。
arialFont = ImageFont.truetype(os.path.join(fontsFolder, 'arial.ttf'), 32)
draw.text((100, 150), 'Howdy', fill='gray', font=arialFont) 
im.save('text.png') 

你可能感兴趣的:(python)