4

Python3,10行代码,我把情书写在她的照片里,她被我的才华征服了。

 2 years ago
source link: https://blog.csdn.net/wuyoudeyuer/article/details/122006099
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

小屌丝:鱼哥,你说这就快到圣诞节了,我应该送女神什么礼物呢?
小鱼:你的女神又不缺什么礼物,倒不如送点惊喜?
小屌丝:送什么惊喜呢?
小鱼:不如,送一份情书?
小屌丝:鱼哥,你的意思,让我领着我女神去KTV里面唱歌?
小鱼:我没有那么肤浅,此情书,不是张学友的那首《情书》,也不是吉克隽逸的那首《三行情书》。
小屌丝:那是什么情书呢? 难道要我去复印社打印一份??
小鱼:也没那么low,
小屌丝:那你这是为难我了,
小鱼:如果把你的情书写在你女神的照片上,并打印出来送给她,她会不会感动??
小屌丝:我去~~ 情书还可以这么玩?
小鱼:那必须的。
小屌丝:鱼哥,那赶紧整啊,我已经…。
在这里插入图片描述

2、Pillow

今天我们来说的这个神器,就是Pillow。
利用的原理就是:把情书写在像素中

把图片无限放大,就会看到一个小小的方格,这就是像素。
也就是说,图片是由无数个像素组成。

2.1 Pillow 安装

我们都知道,针对图片进行操作,就会用到Pillow这个库,因为Pillow 是个第三方库,所以,在使用前,我们要进行 安装。

老规矩, pip 方式安装:

pip install Pillow

其他方式安装:

2.2 Pillow 介绍

安装完成后,我们先来简单介绍几个常用示例

2.2.1 新建及保存图片

# -*- coding:utf-8 -*-
# @Time   : 2021-12-17
# @Author : carl_DJ

from PIL import Image

#创建一张新的图片:mode 为RGB,size :520x520 ,color :0,100,200
img = Image.new('RGB',(520,520),(0,100,200))

# 保存图片
img.save('img.jpg')

运行代码,可以看到,在默认路径自动创建一张img.jpg图片
在这里插入图片描述
我们打开图片,看看是啥样子的。
在这里插入图片描述
没错,就是这张图片。

2.2.2 重新绘制图片

我们在上面生成的图片中,画两条线

# -*- coding:utf-8 -*-
# @Time   : 2021-12-17
# @Author : carl_DJ

from PIL import Image,ImageDraw

#创建一张新的图片
#img = Image.new('RGB',(520,520),(0,100,200))
#img.save('img.jpg')

#直接打开生成的img.jpg图片
img = Image.open('img.jpg')

#取得绘图对象,需要绘制对角线
draw = ImageDraw.Draw(img)

#绘制对角线
draw.line((0,0,img.size[0],img.size[1]),fill = 128 ,width = 2)
draw.line((0,img.size[1],img.size[0],0),fill = 128 ,width = 2)
#保存图片
img.save('img-line.jpg')

运行代码后,我们打开生成的图片
在这里插入图片描述
奈斯,说明符合我们的预期。

2.2.3 图片合并

我们把两个图片合并。

# -*- coding:utf-8 -*-
# @Time   : 2021-12-17
# @Author : carl_DJ

from PIL import Image

#直接打开img.jpg图片
img = Image.open('img.jpg')

#创建一个小的图片
img_small = Image.new('RGB',(30,30),'yellow')

#把img_samll 黏贴在 img.jpg图片的 的20x20的位置
img.paste(img_small,(20,20))

#保存新生成的图片
img.save('img-paste.jpg')

运行代码,我们看下效果
在这里插入图片描述

2.3 实战

简单说一下我们的思路,大致分三步

  • 1、先创建基本的信息:文案内容,像素尺寸,字体类型,图片路径;
  • 2、创建小图来填充内容,在创建大图状态填充好的小图内容;
  • 3、循环遍历图片的内个像素点,把文字黏贴上去。

我们先看下唐三的女神图片:
在这里插入图片描述

我们看下代码实现:

# -*- coding:utf-8 -*-
# @Time   : 2021-12-17
# @Author : carl_DJ

from  PIL import Image,ImageDraw,ImageFont

#像素放大尺寸
img_king_size = 20

#输入内容
text = '我想和你一起吹吹风'
#设置字体
font = ImageFont.truetype('symbol.ttf',img_king_size)

#图片路径
img_path = './king.jpg'

#打开图片
img = Image.open(img_path)
img_w,img_h = img.size

#创建一个小图,用于填充字体
img_child = Image.new("RGB", (img_king_size, img_king_size))
#创建一个大图,状态填充好的小图字体
img_ans = Image.new("RGB",(img_w * img_king_size,img_h * img_king_size))

#获取单个文字的宽和高
text_w,text_h = font.getsize('中')
#文字水平居中
offset_x = (img_king_size - text_w) >> 1
#文字垂直居中
offset_y = (img_king_size - text_h) >> 1

char_index = 0
#小图用于绘制文字
draw = ImageDraw.Draw(img_child)

#循环遍历原图的每一个像素点
for x in range(img_w):
    for y in range(img_h):
        #绘制背景,让图片更好看
        draw.rectangle((0,0,img_king_size,img_king_size),fill = 'lightgray')
        #用(x,y)处的像素点的色值进行绘制字体
        draw.text((offset_x,offset_y),text[char_index],font = font,fill = img.getpixel((x,y)))
        img_ans.paste(img_child,(x * img_king_size,y * img_king_size))
        char_index = (char_index + 1) % len(text)

img_ans.save('king-letter.jpg')

我们看下效果图

在这里插入图片描述
由于生成图片的大小,超过上传最大限制,所以,不能上传原图,
我就截取一下,看看效果:
在这里插入图片描述

写到这里,今天的分享就差不多结束了。
因为Pillow库在图片上的处理应用更多一些,
在这里,小鱼也只是列举了一些常用的,
更多的使用函数,可以自行去官网查阅。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK