千家信息网

怎么使用Python画图纪念黄家驹

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要介绍"怎么使用Python画图纪念黄家驹"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么使用Python画图纪念黄家驹"文章能帮助大家解决问题。
千家信息网最后更新 2025年11月09日怎么使用Python画图纪念黄家驹

这篇文章主要介绍"怎么使用Python画图纪念黄家驹"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么使用Python画图纪念黄家驹"文章能帮助大家解决问题。

思路:

运用 PIL 的 Image 模块与 turtle 模块读取并重新画出图像

就是读取一张有人像的图片,然后通过循环对比,记录下人各行人像的像素坐标,然后再通过 turtle 画出大概的人像轮廓。

Image 模块有直接显示轮廓的函数,而且对于从图象中识别出人像,这个对于小白太难了,所以就选取黑白或者是色彩单一、含人像的图像来识别。

步骤:

步骤操作用到的库
1读取图像,通过遍历每一行像素记录并对比,得到画图所需的人像'坐标'PIL
2根据所得到的坐标,调用 turtle 库画图turtle
第一步,读取图片,获得画图坐标

获取坐标是逐行遍历像素的过程,便利时记录每一行像素中非白色(白色为背景色)的像素条的始末坐标(X1X2)。 对比时,当前像素与同行的下一个像素进行比较,如果两个像素值不同,且有一像素为背景色,那么记录非背景色的横坐标。 记录时,整张图的数据暂时保存在一个列表中,该列表由 n 个列表组成(n 为图像像素行数),这 n 个列表存着对应行的所有非背景色像素条的始末坐标。

源码
from PIL import Imageimport turtle as tdef get_lst(img_path):    imgf = Image.open(img_path)  # 读取图像    global size    print(size:= imgf.size) # 获取图像尺寸/大小    pix = imgf.load()    lst = [[] for i in range(size[1])] # 构造空列表    for y in range(0, size[1]): # 从第一行开始循环        index = 0        for x in range(0, size[0]-1): # 循环第y行的每一个像素            # 如果当前像素与下一个像素值不同且两者有一为背景色,则记录坐标            if pix[x, y] != pix[x+1, y] and (255, 255, 255, 255) in [pix[x, y], pix[x+1, y]]:                if index == 0: # index值为0说明是像素条起始坐标                    lst[y].append([x+1, ])                    index += 1                else: # index值为1说明记录的是像素条结束坐标                    lst[y][-1].append(x)                    index = 0    return lst
第二步,画图

得到了每一个像素条的始末坐标后,就可以逐行画图了

源码
def paint(lst):    fontc = 'whitesmoke' # 右边字的颜色    manc = 'black' #'dimgrey' 人像的颜色    t.setup(width=size[0]+40, height=size[1]) # 绘图窗口大小    t.screensize(bg='oldlace') # 画布背景色    t.bgpic(r'c:\\users\\pxo\\desktop\\bg.png') # 画布背景图    t.speed(333) #画画速度 据说范围[1,10]    for y in range(0, size[1]):        # 遍历每一行        t.pencolor(manc)        for line in lst[y]:            # 遍历每一个像素条            if line[0] > 364 and 144 < y < 495: # 这个是判断是否是右边的字                t.pencolor(fontc)            # 下面是画像素条            t.penup()            t.goto(line[0]-size[0]//2, (size[1]-y)-size[1]//2)            t.pendown()            t.goto(line[1]-size[0]//2, (size[1]-y)-size[1]//2)    t.mainloop()
开始:
if __name__ == '__main__':    img_path = r'c:\\users\\pxo\\desktop\\jh.png' # 图像地址    lst = get_lst(img_path)    paint(lst)

这样就实现了使用 Python Turtle+PIL 绘制黄家驹效果。

随机线条实现方式:

from PIL import Imageimport turtle as tfrom random import choicedef get_lst(img_path):    imgf = Image.open(img_path)    global size    print(size:= imgf.size)    pix = imgf.load()    lst = [[] for i in range(size[1])]    for y in range(0, size[1]):        index = 0        for x in range(0, size[0]-1):            if pix[x, y] != pix[x+1, y] and (255, 255, 255, 255) in [pix[x, y], pix[x+1, y]]:                if index == 0:                    lst[y].append([y, x+1, ]) # 这里在每一个像素条的数据中加入了其纵坐标y                    index += 1                else:                    lst[y][-1].append(x)                    index = 0    # 这里也改了,返回的数据列表的子元素是所有单独的像素条,而不是某一行像素条的总和    lt = []    for i in lst:        for j in i:            if j:                lt.append(j)    return ltdef paint(lst):    fontc = 'darkorange'    manc = 'black' #'dimgrey'    t.setup(width=size[0]+40, height=size[1]+40)    t.screensize(bg='oldlace')    #t.bgpic(r'c:\\users\\pxo\\desktop\\bg.png')    t.speed(330)    cnt = len(lst)    lt = [i for i in range(cnt)] # 弄一个种子列表,理解为存取位置    flst = []    for i in range(cnt):        del lt[lt.index(index:=choice(lt))] #获取并删除一个随机位置        line = lst[index]  # 从所有线条中得到一条随机线条(像素条)        y = line[0]        x1, x2 = line[1], line[2]        t.pencolor(manc)        if x1 > 364 and 144 < y < 495:            flst.append(line)            continue        t.penup()        t.goto(x1-size[0]//2, (size[1]-y)-size[1]//2)        t.pendown()        t.goto(x2-size[0]//2, (size[1]-y)-size[1]//2)    new_flst = sorted(flst[:-80], reverse=True)    for line in new_flst:        y = line[0]        x1, x2 = line[1], line[2]        t.pencolor(fontc)        t.penup()        t.goto(x1-size[0]//2, (size[1]-y)-size[1]//2)        t.pendown()        t.goto(x2-size[0]//2, (size[1]-y)-size[1]//2)    t.hideturtle()    t.mainloop()if __name__ == '__main__':    img_path = r'c:\\users\\pxo\\desktop\\jh.png'    lst = get_lst(img_path)    paint(lst)

关于"怎么使用Python画图纪念黄家驹"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

像素 坐标 人像 背景 图像 一行 黄家 不同 始末 数据 模块 知识 线条 循环 位置 右边 图片 大小 步骤 源码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发维护 招聘 网络安全工程师的职位代号 广州市乐资互联网科技有限公司 工程网络技术厂家供应 我的门派怎么切换服务器 bitmap在数据库应用 如何提高数据库的安全性 义乌深圳东塔网络安全培训 数据库的排序规则一般是哪个 厦门人才网络安全工程师 数据库技术基础大作业 滨湖区咨询软件开发费用是多少 数据库系统概论考研面试题 放映机杜比服务器关闭安全门 影视播放软件开发 第一届北京网络安全大会哪一年 深圳企业软件开发如何收费 ncbi上传测序数据库 摸排三大数据库名单扶贫 如何防止服务器不被人入侵 软件开发工程师有多累会得什么病 一个处理器有几个数据库 牟平区电商软件开发哪家好 山东商业软件开发代理价钱 蚂蚁金服推出的国产分布数据库 怀旧服服务器阵营人数占比 2020互联网科技展会 宁波软件开发优化建站 2u服务器多重 江阴计算机网络技术注意事项
0