第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果
第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
第 0005 题:你有一个目录,装了很多照片,把它们的尺寸都变成不大于 iPhone5 分辨率的大小
第 0010 题:使用 Python 生成类似于下图中的字母验证码图片;
第 0022 题:iPhone 6、iPhone 6 Plus 早已上市开卖,请查看你写的 第 0005 题的代码是否可以复用;
Pillow
The friendly PIL fork (Python Imaging Library)
PIL:Python Imaging Library,顾名思义,这是 Python 平台上的图像处理标准库,功能非常强大,API 非常简单易用,但是由于许久未维护了,对 Python 3 不支持,所以选用 Pillow(在 PIL 基础上创建的兼容版本),支持最新的 Python 3.x,又加入了许多新特性。
安装 Pillow
$ pip3 install pillow
简单操作图片
# -*- coding: utf-8 -*-
from PIL improt Image
imagefile = './111.png'
# 打开一个图片
image = Image.open(imagefile)
print(image.show())
Image 类
Pillow 库中最核心的类就是 Image 了,读取图片、处理图片、创建图片等操作都需要 Image 的支持;
# -*- coding: utf-8 -*-
from PIL import Image
# 打开一个图片,并返回 Image 对象
image = Image.open("111.jpg")
# 查看图片各项属性
print(image.format, image.size, image.mode)
Pillow 库支持非常多的图片格式,使用 open() 函数直接读取图片即可,不需要考虑图片的格式,Pillow 自己会处理。
Image 模块中 save() 函数可以保存图片,除非自定义文件格式,那么文件中扩展名用来指定文件格式:
from PIL import Image
image = Image.open('111.jpg')
# Image 模块中 save() 函数保存图片
image.save('222.png')
# 保存为指定格式
image.save('222', 'jpeg')
Pillow 不会解码或 raster 数据,当你打开一个文件,Pillow 通过文件头确认文件格式,大小,mode 等数据,余下数据直到需要时才处理,这就意味着 Pillow 在打开文件时非常快,与文件大小和压缩格式无关;
裁剪、粘贴、合并图片
from PIL import Image
image = Image.open('111.jpg')
# 从图片中提取一个子矩形 (left, upper, right, lower), Pillow 左边系统的原点(0,0)为图片的左上角,坐标中的数字
# 单位为像素点,下面为截取图片大小为 300*300 像素
box = (100, 100, 400, 400)
region = image.crop(box)
# Rolling an image
def roll(image, delta):
"Roll an image sideways"
xsize, ysize = image.size
delta = delta % xsize
if delta == 0: return image
part1 = image.crop((0, 0, delta, ysize))
part2 = image.crop((delta, 0, xsize, ysize))
part1.load()
part2.load()
image.paste(part2, (0, 0, xsize-delta, ysize))
image.paste(part1, (xsize-delta, 0, xsize, ysize))
return image
# Splitting and merging bands
r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))
操作图像
# -*- coding: utf-8 -*-
from PIL import Image, ImageFilter
# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 获得图像尺寸:
w, h = im.size
print('Original image size: %sx%s' % (w, h))
# 缩放到50%:
im.thumbnail((w//2, h//2))
print('Resize image to: %sx%s' % (w//2, h//2))
# 把缩放后的图像用jpeg格式保存:
im.save('thumbnail.jpg', 'jpeg')
# 开启模糊滤镜
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')
ImageDraw
PIL 的 ImageDraw 提供了一系列绘图方法,可以直接绘图,生成验证码图片等:
第 0010 题中图片就是使用 ImageDraw 生成的。
其他更多功能可以参考 Pillow 官网文档:https://pillow.readthedocs.org/random
random
random 模块主要用于生成随机数
random.uniform
random.uniform(a, b) ,用于生成一个指定范围(a,b)内的随机浮点数
bpython version 0.16 on top of Python 3.5.1 /usr/local/opt/python3/bin/python3.5
>>> import random
>>> random.uniform(1, 10)
8.273246268076129
>>>
random.randint
random.randint(a, b),用于生成一个指定范围内的整数:
>>> random.randint(64, 255)
119
>>>
random.randrange
random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中获取一个随机数:
# random.randrange(10, 100, 2) 相当于从 [10, 12, 14... 96, 98] 序列中获取一个随机数
# 相当于 random.choice(range(10, 100, 2))
>>> random.randrange(10, 100, 2)
68
>>>
random.choice
random.choice(sequence),从序列中获取一个随机元素,sequence 泛指一系列类型:list、tuple,str 等都属于 sequence:
>>> random.choice(["JGood", "is", "a"])
'JGood'
>>> random.choice("学习 python")
'n'
>>> random.choice(("JGood", "is", "a"))
'is'
>>>
random.shuffle
random.shuffle(x [, random]),用于将一个列表中的元素打乱,如同洗牌;
>>> p=["Python","is","powerful","simple","andsoon..."]
>>> random.shuffle(p)
>>> print(p)
['Python', 'andsoon...', 'simple', 'is', 'powerful']
>>>
random.sample
random.sample(sequence, k),从指定序列中随机获取指定长度的片段,sample 不会修改原有序列:
>>> list=[1,2,3,4,5,6,7,8,9,10]
>>> slice=random.sample(list,5) # 从 list 中随机获取 5 个元素,作为一个片段返回
>>> print(slice)
[7, 4, 5, 10, 1]
>>> blice=random.sample(list)
Traceback (most recent call last):
File "<input>", line 1, in <module>
blice=random.sample(list)
TypeError: sample() missing 1 required positional argument: 'k'
>>> blice=random.sample(list, k=1)
>>> print(blice)
[9]
>>>
题目代码上传至 github 上