程序员的浪漫-用她的名字作画Python版

程序员的浪漫-用她的名字作画Python版

hello,大家好,我是一灰灰,之前介绍了一篇使用她的名字来画出她的美图的文章,其中主要使用的Java来实现的,今天呢,我们再来用Python来实现一下

同样最终的代码量也不会超过三十行

<!-- more -->

上篇博文超链:* 程序员的浪漫-用她的名字作画Python版 - 一灰灰Blog

1. 环境相关

这里我们选择python来作为我们的主要绘图武器,至于python的环境安装相关的这里就不介绍了,有兴趣的小伙伴自行探索

再python界,操作图片的利器PIL,相信大伙也都清楚,接下来将使用它来实现我们的目标

安装依赖

pip install Pillow

2. 基本知识点

再正式开始之前,给不太熟悉PIL操作的小伙伴,简单介绍一下它的基本用法,当然也会重点突出一下我们将采用的几个方法

2.1 加载图片

from PIL import Image

img = Image.open("图片地址")

是的,就这么简单,直接使用 Image.open() 就可以读取图片了

2.2 图片基本信息获取

获取图之后,通常需要关注的几个参数,如宽高,通道

width, height = img.size
# RGBA 表示包含透明度,如png
# RGB 不包含透明度,如jpg
mode = img.mode

2.3 创建画板,用于编辑

如果我们想在这个图片上进行绘制信息,或者说希望创建一个空的画板,那么我们就先需要获取到一个ImageDraw对象

from PIL import ImageDraw

# 获取图片对应的画板
draw = ImageDraw.Draw(img)

上面获取到draw对象之后,就可以根据它提供的各种方法,来绘制各种几何图形、文字、图片等;如果我们希望获取一个空的画板,可以怎么操作呢?


# 创建一个待透明度的图,第二个元组参数为图的宽高,第三个表示背景全透明
new_img = Image.new("RGBA", (width, height), (255, 255, 255, 0))

ImageDraw提供了很多绘图的方法,下面给出一些常用的case,就不重点叙述了

new_img = Image.new("RGBA", (480, 640), (255, 255, 255, 0))
# 创建绘制对象
draw = ImageDraw.Draw(new_img)

# 从 (10, 10) -> (100, 100) 画一条黄色直线
draw.line((10, 10, 100, 100), 'red')

# 绘制矩形 (100, 110) -> (200, 200),黑色填充,黄色填充
draw.rectangle((100, 110, 200, 200), 'black', 'red')

# 绘制椭圆
draw.ellipse((300, 300, 500, 400), 'yellowgreen', 'red')
# 园
draw.ellipse((250, 250, 350, 350), 'seagreen', 'red')

# 绘制文本,选择宋体,字体大小为28,uniquecode编码
font = ImageFont.truetype("simsun.ttc", 28, encoding="unic")
draw.text((300, 200), u'一灰灰Blog', 'red', font)

重点关注绘制文本这里,draw.text((x,y), "文字", "文字颜色", 字体), 这就是接下来要使用的方法

2.4 获取像素

如果我们希望获取指定坐标的RGB值,如下操作即可

pixel = img.getpixel((x, y))

看到这里的小伙伴,结合前一篇博文,要想实现python版的用她的名字绘图,相信就很简单了吧

2.5 预览和保存图片

# 展示图片
new_img.show()

# 保存图片
new_img.save("save.png")

3. Python版文字绘图

接下来,进入正式的实现

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

def render(path: str, name: str, save: str):
    img = Image.open(path)
    width, height = img.size
    # 创建画板,放大24倍
    new_img = Image.new("RGBA", (width * 24, height * 24), (255, 255, 255, 0))
    draw = ImageDraw.Draw(new_img)

    # 加载自定义字体,字体文件来自 https://www.diyiziti.com/Builder/446
    font = ImageFont.truetype(u"D://MobileFile/潇洒手写体.ttf", 20, encoding="unic")  # 设置字体
    render_index = 0
    for x in range(width):
        for y in range(height):
            pixel = img.getpixel((x, y))
            draw.text((x * 24 + 2, y * 24 + 2), name[render_index], pixel, font)  # 再指定的地方使用文字替代之前的纯色
            render_index = (render_index + 1) % len(name)
    new_img.save(save)

依然以小黄人为例,来看下生成的效果如何

从上面的图片来看,和前面java版输出差不离,有兴趣的小伙伴动手搞起来吧;我是一灰灰,觉得不错的小伙伴给个收藏、点赞、评论支持一下呗

一灰灰的联系方式

尽信书则不如无书,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

QrCode


hhui
一灰灰Blog的个人编程记录
248 声望
45 粉丝
0 条评论
推荐阅读
SpringBoot系列之数据库初始化-datasource配置方式
在我们的日常业务开发过程中,如果有db的相关操作,通常我们是直接建立好对应的库表结构,并初始化对应的数据,即更常见的情况下是我们在已有表结构基础之下,进行开发;但是当我们是以项目形式工作时,更常见的...

小灰灰Blog阅读 566

数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.4k

滚蛋吧,正则表达式!
你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」,首先想到的就是直接百度上搜索一个,然后采用 CV 大法神奇地接入到你的代码中?

良许3阅读 1.5k

搭个ChatGPT算法模型,从哪开始?
最近 ChatGPT 很火,火到了各行各业。记得去年更多的还是码农最新体验后拿它搜代码,现在各行各业都进来体验,问它咋理财、怎么写报告和给小孩起名。😂 也因此让小傅哥在头条的一篇关于 ChatGPT 的文章都有了26万...

小傅哥6阅读 1.3k

封面图
程序员适合创业吗?
大家好,我是良许。从去年 12 月开始,我已经在视频号、抖音等主流视频平台上连续更新视频到现在,并得到了不错的评价。每个视频都花了很多时间精力用心制作,欢迎大家关注哦~考虑到有些小伙伴没有看过我的视频,...

良许3阅读 1.3k

PyCharm 激活破解教程, 2023 年 2 月亲测有用
本文分享一下PyCharm 2022.2.3 版本最新激活破解教程,注意不要使用太新的版本,都是 Jetbrains 产品,本文专门配上了 Pycharm 的图片,跟着下面教程一步一步来即可。

程序员徐公阅读 10.3k评论 1

Ubuntu20.04 从源代码编译安装 python3.10
Ubuntu 22.04 Release DateUbuntu 22.04 Jammy Jellyfish is scheduled for release on April 21, 2022If you’re ready to use Ubuntu 22.04 Jammy Jellyfish, you can either upgrade your current Ubuntu syste...

ponponon1阅读 4.6k评论 1

248 声望
45 粉丝
宣传栏