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

文章目录
  1. 1. 环境相关
  2. 2. 基本知识点
    1. 2.1 加载图片
    2. 2.2 图片基本信息获取
    3. 2.3 创建画板,用于编辑
    4. 2.4 获取像素
    5. 2.5 预览和保存图片
  3. 3. Python版文字绘图
  • 一灰灰的联系方式
  • hello,大家好,我是一灰灰,之前介绍了一篇使用她的名字来画出她的美图的文章,其中主要使用的Java来实现的,今天呢,我们再来用Python来实现一下

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

    1. 环境相关

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

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

    安装依赖

    1
    pip install Pillow

    2. 基本知识点

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

    2.1 加载图片

    1
    2
    3
    from PIL import Image

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

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

    2.2 图片基本信息获取

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

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

    2.3 创建画板,用于编辑

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

    1
    2
    3
    4
    from PIL import ImageDraw

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

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

    1
    2
    3

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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值,如下操作即可

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

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

    2.5 预览和保存图片

    1
    2
    3
    4
    5
    # 展示图片
    new_img.show()

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

    3. Python版文字绘图

    接下来,进入正式的实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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

    # Python

    评论

    Your browser is out-of-date!

    Update your browser to view this website correctly. Update my browser now

    ×