摘要:每到情人节、七夕节,不少小伙伴大伙伴们都会遇到这样一个世纪问题——怎么给女朋友/老婆一个与众不同的节日惊喜。今天给大家分享一个独特的表白方法——用“我爱你”拼出心爱人的模样!
 
每到情人节、七夕节,不少小伙伴大伙伴们都会遇到这样一个世纪问题——怎么给女朋友/老婆一个与众不同的节日惊喜。
 
你说送花吧,到时候朋友圈里一划,全部都是送花的,女票:“没创意!”,遂卒;
 
你说送礼物吧,要是送的礼物不合心意,女票:“你根本不懂我!”,又卒;
 
你说逛街买买买吧,摸摸空空的口袋,默默把这个想法丢到一边...
 
今天,就和大家分享一个独特的表白方法——用“我爱你”拼出心爱人的模样!

成品图!

 
什么?看不清长啥样?放大来康康

(满眼都是爱你的形状~)

 
想做出这样的照片吗?那么~我们现在就开始啦~
 

1. 需要准备的有

女票超级无敌可爱美腻的照片 1张!
python (这里用的是python3.7)
需要的用到的库
cv2:用来读取照片
PIL:用来生成新的图片
性能比较OK的电脑
(如果没有接触过python,不想/不会配环境、装cv2、PIL之类的库,或者电脑性能不太够,强烈推荐使用华为云的ModelArts进行开发~直接解决环境配置、电脑性能的各种问题~)

2. 基本思路

要实现这样的效果,首先需要有一张照片,提取其像素信息,然后赋给排布满文字的新图片,就能得到如上图所示的一张新图片啦!
废话不多说,接下来就开始吧~

3.操作流程

1.首先导入用到的库(两者的作用在1中已有介绍)

import cv2
from PIL import Image, ImageDraw, ImageFont

2.然后开始声明绘图的方法

这里有两个参数,分别是原图片的路径和要写的文字
def draw(pic, draw_text):

3.接着读取图片

使用cv2中的imread方法读取图片信息,
使用PIL中的Image方法创建一个新的图片,其尺寸和源图片一致,背景为白色
img = cv2.imread(pic)
blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white")
drawObj = ImageDraw.Draw(blank) # 告诉程序,我们接下来就要在这个图上写字啦!

4.声明绘图的一些参数(这些参数都是我经过多次试验得到的最佳大小~)

n = 10 # 读取像素的间隔
m = 9 # 字体的大小
font_path = '你使用字体的位置' # 字体的路径
font = ImageFont.truetype(font_path, size=m) # 将字体信息赋给font变量,供后续使用

5.接下来就是最关键的一步!把文字写上去,并按照源图片给图片上色

通过两个for循环,依次定位到每个文字所在的色块(中间间隔n是因为文字比像素块大得多,不可能完全按照每个像素的位置和色彩来排布)
使用text()方法填入带色彩的文字,几个参数分别代表:
[j, i] -- 坐标位置
draw_text[int(j / n) % len(draw_text)] -- 找到当前该写入哪个文字了(比如“我爱你”中的第几个字)
fill=(img[i][j][2], img[i][j][1], img[i][j][0]) -- 代表源图片对应位置的颜色(三个分别代表RBG颜色值)
font -- 显然就是字体信息啦~
for i in range(0, img.shape[0], n):
for j in range(0, img.shape[1], n):
drawObj.text(
[j, i],
draw_text[int(j / n) % len(draw_text)],
fill=(img[i][j][2], img[i][j][1], img[i][j][0]),
font=font
) # 按句子的顺序填充文字

6.写入完成,导出图片

blank.save('img_' + pic) # 保存生成的图片

7.调用我们封装好的方法~

输入图片路径和目标文字,运行~一张独一无二的表白图就大功告成!
draw('1.jpg', "我爱你")
附上全代码(记得把字体路径改成自己电脑的哟~)
import cv2
from PIL import Image, ImageDraw, ImageFont
 
def draw(pic, draw_text):
img = cv2.imread(pic)
blank = Image.new("RGB", [img.shape[1], img.shape[0]], "white")
drawObj = ImageDraw.Draw(blank)
 
n = 10
m = 9
 
font = ImageFont.truetype(font_path, size=m)
 
for i in range(0, img.shape[0], n):
for j in range(0, img.shape[1], n):
drawObj.text(
[j, i],
draw_text[int(j / n) % len(draw_text)],
fill=(img[i][j][2], img[i][j][1], img[i][j][0]),
font=font
)
 
blank.save('img_' + pic)
 
draw('1.jpg', "我爱你")

进阶~

既然都能做成一帧一帧的图片了,为什么不把他们连接起来~做成一个表白视频呢?
 
当然阔以!
 
 

赶在520之前,程序员如何用Python送上最特别的“我爱你”表白的更多相关文章

  1. [No000096]程序员面试题集【上】

    对几家的面试题凭记忆做个总结,基本全部拿到offer,由于时间比较长,题目只写大体意思,然后给出自己当时的答案(不保证一定正确): abstract类不可以被实例化 蛋糕算法: 平面分割空间:(n-1 ...

  2. 小程序员在android移动应用上的赚钱经历

    先说说我自己吧,二线城市(以外包为主)的小程序员,工作多年了,月收入5-6K.主要从事asp.net web网站开发,java,c++,php,ruby都懂一些,属于那种对问题不求甚解型,爱好电脑游戏 ...

  3. Java程序员的Golang入门指南(上)

    Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如 ...

  4. C程序员眼里的Python

    注释 Phython的注释和C语言非常不同,第一种 #开头的注释,类似于C的//开头,而"""对 包围注释,类似于C的/* */,以及xml类的<!--    -- ...

  5. 程序员如何描述清楚线上bug

    案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...

  6. 作为一个程序员,你了解 win 上有哪些必装的软件吗

    关于 win 的一些基础必知内容之前已经分享过,没有看过的可以戳此处→Windows 使用之那些你还不知道操作 新系统安装的第一个软件 Google Chrome 毫无疑问,作为程序员应该是首选的浏览 ...

  7. [python]通过微信公众号“Python程序员”,编写python代码

    今天发现微信公众号中,居然可以编写python代码,很是惊喜,觉得蛮有趣的. 步骤如下: 1.关注微信公众号“Python程序员” 2.关注成功后,点击右下角的“潘多拉”->"Pyth ...

  8. 微信小程序里如何用阿里云上传视频,图片。。

    纯手写,踩了半天多的坑干出来了... 网上也有对于阿里云如何在微信小程序里使用,但是很不全,包括阿里云文档的最佳实践里. 话不多说上代码了. upvideo(){ var aliOssParams = ...

  9. 资深程序员:学Python我推荐你用这几款编辑器

    Python使用什么编辑比较好,Python编辑器推荐 各位 Pythoner 好啊!在这个烦躁的时代,相聚就是缘分,很高兴各位 Pythoner 能相聚于此,希望接下来的路,我们一起走下去,使用 P ...

  10. java程序员快速掌握python系列——概述

    这一系列主要是总结学习python过程中的方方面面(已经学完,时间大概是一周左右).当然限于个人水平java也就是够用,python短时间内也不可能深入到哪里去.所以这次的分享的目的是能够快速使用py ...

随机推荐

  1. MySQL PXC 集群运维指南

    目录 一.PXC方案概述 二.PXC基础知识 三.PXC节点的配置安装 四.PXC节点的上线与下线 五.其他 一.PXC方案概述 Percona XtraDB Cluster (PXC) 是一个完全开 ...

  2. python学习笔记(持续更新)

    一.对列表的操作 #建立一个列表 list = [1,2,3,4] #打印列表 print(list) #在列表尾部添加元素 list.append(5) #在指定位置插入元素 list.insert ...

  3. ELK-日志收集-Kibana WEB安全认证

    1.ELK收集MYSQL日志实战: 日志收集存放目录位置: /usr/local/logstash/config/etc/   1)日志采集-存入redis缓存数据库:mysql-redis.conf ...

  4. 2023 SHCTF-校外赛道 Crypto—Wp

    WEEK1 立正 wl hgrfhg 4gNUx4NgQgEUb4NC64NHxZLg636V6CDBiDNUHw8HkapH :jdoi vl vlkw ~xrb wd nrrT Y: 凯撒解密,偏 ...

  5. react,es6的括号问题

    JavaScript 会自动给行末添加分号.如果 return 后面换行不加括号就会变成 return;. 就是说因为jsx语句跨行了,如果写在一行是可以省略小括号的. const About = ( ...

  6. 研读Java代码必须掌握的Eclipse快捷键

    1. Ctrl+左键 和F3 这个是大多数人经常用到的,用来查看变量.方法.类的定义 跳到光标所在标识符的定义代码.当按执行流程阅读时,F3实现了大部分导航动作. 2 Ctrl+Shift+G 在工作 ...

  7. node版本依赖报错那些事儿

    前言 昨天还能跑的的项目,今天就歇菜了 第一步 删除大法 依赖问题,那就把.lock/ node_modules 删除重新装 第二步 如果重装不好使,那就各种降低版本尝试 遇到这样的 有两种方式 1. ...

  8. 沫沫漫画网Js逆向分析爬取全站资源入库处理图片合并

    网站分析 打开目标网站:https://www.momomh.com/ 选择一部漫画作为分析对象:<渴望:爱火难耐> 进到漫画详情页这里,发现并没有需要逆向分析.直接可以获取漫画信息.随便 ...

  9. 模拟ASP.NET Core MVC设计与实现

    前几天有人在我的<ASP.NET Core框架揭秘>读者群跟我留言说:"我最近在看ASP.NET Core MVC的源代码,发现整个系统太复杂,涉及的东西太多,完全找不到方向,你 ...

  10. C/C++ 开发SCM服务管理组件

    SCM(Service Control Manager)服务管理器是 Windows 操作系统中的一个关键组件,负责管理系统服务的启动.停止和配置.服务是一种在后台运行的应用程序,可以在系统启动时自动 ...