侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

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

2023-11-20 星期一 / 0 评论 / 0 点赞 / 59 阅读 / 7571 字

第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果 第 0001 题:做为 Apple Store App 独立开发者,你

第 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 Imageimagefile = './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 Imageimage = Image.open('111.jpg')# Image 模块中 save() 函数保存图片image.save('222.png')# 保存为指定格式image.save('222', 'jpeg')

    Pillow 不会解码或 raster 数据,当你打开一个文件,Pillow 通过文件头确认文件格式,大小,mode 等数据,余下数据直到需要时才处理,这就意味着 Pillow 在打开文件时非常快,与文件大小和压缩格式无关;

裁剪、粘贴、合并图片

from PIL import Imageimage = Image.open('111.jpg')# 从图片中提取一个子矩形 (left, upper, right, lower), Pillow 左边系统的原点(0,0)为图片的左上角,坐标中的数字# 单位为像素点,下面为截取图片大小为 300*300 像素box = (100, 100, 400, 400)region = image.crop(box)# Rolling an imagedef 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 bandsr, 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.sizeprint('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 上

 

 

广告 广告

评论区