python 用汉字组成图片

python_用汉字组成图片

刷视频的时候从B站看到了个简单有趣的python项目,于是便学(chao)习(xie)了一下.
视频链接
内容基本源自视频,建议观看视频。(侵删)

事情是这样的,假如你某天看到一张冰冰的大图,想着用冰冰的图片对冰冰表白,但是直接p图我爱你之类的又老套又直白又明显,万一冰冰拒绝了岂不是很尴尬。与是你想到了一个鬼点子 (好主意)——用文字把“我的心是冰冰的”组成一张照片,然后发给冰冰。万一冰冰拒绝了就假装不知道(\狗头 这波是白给)

你开始研究这个想法。你发现图片是由一个一个有颜色的像素点构成,如果这个像色点变成有颜色的文字,再组合起来,那岂不是构成了一张大图了。

但是在你开始前,你还需要一个字体,据up的视频我使用了阿里巴巴的惠普体
在页面底部有下载通道
字体文件放在py文件的同一个目录里(不会吧不会吧,不会有人看不懂吧,上图)
在这里插入图片描述

不仅如此,你还需要一个可以对图片操作的库文件,在Pycharm的terminal终端里输入
这句话:pip install Pillow
在这里插入图片描述

库文件安装完成后,你开始进行代码操作
导入库文件

import sys
from PIL import Image, ImageDraw, ImageFont

先载入字体

CHILD_W = CHILD_H = 16 #子图的宽高
txt = '我的心是冰冰的' #输出的文字
font = ImageFont.truetype("Alibaba-PuHuiTi-Bold.ttf", CHILD_W)  # 字体及大小

然后打开图片,并获取原图的宽高数据

    imgSrc = Image.open(sys.argv[1])  # 打开原图像
    w, h = imgSrc.size  # 原图像宽高

创建一个子图,同时创建一个生成的目标图

    imageChild = Image.new("RGB", (CHILD_W, CHILD_H))  # 新建子图
    imageDst = Image.new("RGB", (CHILD_W * w, CHILD_H * h))  # 新建子图

获取单个文字的宽高信息,依据次来计算文字居中的偏移量

    textW, textH = font.getsize("迷")  # 取单个文字的宽高信息
    offsetX = (CHILD_W - textW) >> 1  # 水平居中(其实就是文本宽度差/2)
    offsetY = (CHILD_H - textH) >> 1  # 垂直居中

设置一个计数器记录下标,和一个画图的最小单位

    charIndex = 0  # 记录文字下标
    draw = ImageDraw.Draw(imageChild)  # 取最小绘图对象,用于绘制文字

遍历每个像素点,然后将对应位置的像素点变成颜色相近的图片

    for y in range(h):
        for x in range(w):
            draw.rectangle((0, 0, CHILD_W, CHILD_H), fill="lightgray") #设置灰色背景图

            draw.text((offsetX, offsetY), txt[charIndex], 
            	font=font, fill=imgSrc.getpixel((x, y)))  #将文字画在子图上
            imageDst.paste(imageChild,(x*CHILD_W,y*CHILD_H) )#将子图贴在目标图上,这里注意下标位置的对应

            charIndex=(charIndex+1)%len(txt) #控制长度,注意要取模

最后保存目标图片

   imageDst.save(sys.argv[2])

解释一下,这个sys.argv[1]和sys.argv[2]是获取命令行参数的,所以直接掏pycharm运行是跑不出来的。
打开下面的terminal终端,输入cd命令(不会有人不知道吧\狗头),打开到py文件所在的位置,然后输入
python py文件的名字.py 要转换的图片.jpg 转换后的名字.jpg
如图:
切目录
切换目录
输入指令
在这里插入图片描述
等待转换,完成后在这里插入图片描述
打开一看

应该能看清吧
哇哦~~~~
于是你信誓旦旦,兴高采烈,欣喜若狂,喜形于色,得意忘形的发给了冰冰~ ~ ~
原图:
芜湖~
新图:
内存变化
冰冰:这图片太大了,没流量没内存,不看了
你:呜呜呜呜~ ~ ~ 这波是白给

其实,这里可以不必要引入sys库,直接input也行,然后这样
芜湖
效果相同。

源代码

"""
author:呼噜呼噜~
date: 2021年09月20日
"""
# import sys
from PIL import Image, ImageDraw, ImageFont

origin_name=input()#原图片名
dst_name=input()#目标图片名


CHILD_W = CHILD_H = 16
txt = '我的心是冰冰的'
font = ImageFont.truetype("Alibaba-PuHuiTi-Bold.ttf", CHILD_W)  # 字体及大小

if __name__ == '__main__':
    imgSrc = Image.open(origin_name)  # 打开原图像
    w, h = imgSrc.size  # 原图像宽高

    imageChild = Image.new("RGB", (CHILD_W, CHILD_H))  # 新建子图
    imageDst = Image.new("RGB", (CHILD_W * w, CHILD_H * h))  # 新建子图

    textW, textH = font.getsize("迷")  # 取单个文字的宽高信息
    offsetX = (CHILD_W - textW) >> 1  # 居中
    offsetY = (CHILD_H - textH) >> 1

    charIndex = 0  # 记录文字下标
    draw = ImageDraw.Draw(imageChild)  # 取最小绘图对象,用于绘制文字

    for y in range(h):
        for x in range(w):
            draw.rectangle((0, 0, CHILD_W, CHILD_H), fill="lightgray")

            draw.text((offsetX, offsetY), txt[charIndex], font=font, fill=imgSrc.getpixel((x, y)))
            imageDst.paste(imageChild,(x*CHILD_W,y*CHILD_H) )

            charIndex=(charIndex+1)%len(txt)

    imageDst.save(dst_name)

本笔记仅供学习交流,侵删

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值