show-me-the-code:图片处理

第 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 上

 

 

转载于:https://my.oschina.net/u/2470065/blog/865826

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值