用 Python 将神龙大侠搞怪 GIF 转为字符动画


谁是神龙大侠?

动画电影《功夫熊猫》相信很多人都看过,主角是一只武功高强又经常搞怪名字叫阿宝的熊猫,在选拔神龙大侠的比武中,阿宝成为神龙大侠,所以现在的神龙大侠就是熊猫阿宝。

运行环境

  • 系统:Windows
  • Python 版本:3.6
  • 模块:os、imageio、PIL

第三方模块的安装使用 pip install ... 即可。

基本思路

  • 将 gif 图片的每一帧拆分为静态图片
  • 将所有静态图片变为字符画
  • 将所有字符画重新合成 gif

主要实现

1. 将 gif 每一帧拆分为静态图片

def gif2pic(file, ascii_chars, font, scale):
    '''
    file: gif 文件
    ascii_chars: 灰度值对应的字符串
    font: ImageFont 对象
    scale: 缩放比例
    '''
    im = Image.open(file)
    path = os.getcwd()
    if(not os.path.exists(path+"/tmp")):
        os.mkdir(path+"/tmp")
    os.chdir(path+"/tmp")
    # 清空 tmp 目录下内容
    for f in os.listdir(path+"/tmp"):
        os.remove(f)
    try:
        while 1:
            current = im.tell()
            name = file.split('.')[0]+'_tmp_'+str(current)+'.png'
            # 保存每一帧图片
            im.save(name)
            # 继续处理下一帧
            im.seek(current+1)
    except:
        os.chdir(path)

2. 将静态图片变成字符画

def img2ascii(img, ascii_chars, font, scale):
    scale = scale
    # 将图片转换为 RGB 模式
    im = Image.open(img).convert('RGB')
    # 设定处理后的字符画大小
    raw_width = int(im.width * scale)
    raw_height = int(im.height * scale)
    # 获取设定的字体的尺寸
    font_x, font_y = font.getsize(' ')
    # 确定单元的大小
    block_x = int(font_x * scale)
    block_y = int(font_y * scale)
    # 确定长宽各有几个单元
    w = int(raw_width/block_x)
    h = int(raw_height/block_y)
    # 将每个单元缩小为一个像素
    im = im.resize((w, h), Image.NEAREST)
    # txts 和 colors 分别存储对应块的 ASCII 字符和 RGB 值
    txts = []
    colors = []
    for i in range(h):
        line = ''
        lineColor = []
        for j in range(w):
            pixel = im.getpixel((j, i))
            lineColor.append((pixel[0], pixel[1], pixel[2]))
            line += get_char(ascii_chars, pixel[0], pixel[1], pixel[2])
        txts.append(line)
        colors.append(lineColor)
    # 创建新画布
    img_txt = Image.new("RGB", (raw_width, raw_height), (255, 255, 255))
    # 创建 ImageDraw 对象以写入 ASCII
    draw = ImageDraw.Draw(img_txt)
    for j in range(len(txts)):
        for i in range(len(txts[0])):
            draw.text((i*block_x, j*block_y), txts[j][i], colors[j][i])
        img_txt.save(img)

def get_char(ascii_chars, r, g, b):
    length = len(ascii_chars)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    return ascii_chars[int(gray/(256/length))]

3. 将所有字符画合成 gif

def pic2gif(dir_name, duration):
    path = os.getcwd()
    os.chdir(dir_name)
    dirs = os.listdir()
    images = []
    num = 0
    for d in dirs:
        images.append(imageio.imread(d))
        num += 1
    os.chdir(path)
    imageio.mimsave(d.split('_')[0]+'_char.gif',images,duration = duration)

效果展示

我们找两张神龙大侠搞怪 gif 图片,如下所示:

原图1

原图2

看一下处理后的效果图:

完整代码请关注文末公众号,后台回复 GIF 免费获取。


  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 Python 熊猫设计代码,需要使用 `turtle` 模块来实现: ```python import turtle # 设置布大小和背景色 turtle.setup(800, 600) turtle.bgcolor("white") # 绘制熊猫的头部 turtle.penup() turtle.goto(-100, 100) turtle.pendown() turtle.begin_fill() turtle.circle(80) turtle.end_fill() # 绘制熊猫的左耳朵 turtle.penup() turtle.goto(-60, 190) turtle.pendown() turtle.setheading(60) turtle.begin_fill() for i in range(3): turtle.forward(40) turtle.right(120) turtle.end_fill() # 绘制熊猫的右耳朵 turtle.penup() turtle.goto(20, 190) turtle.pendown() turtle.setheading(120) turtle.begin_fill() for i in range(3): turtle.forward(40) turtle.right(120) turtle.end_fill() # 绘制熊猫的眼睛 turtle.penup() turtle.goto(-40, 140) turtle.pendown() turtle.begin_fill() turtle.circle(10) turtle.end_fill() turtle.penup() turtle.goto(20, 140) turtle.pendown() turtle.begin_fill() turtle.circle(10) turtle.end_fill() # 绘制熊猫的鼻子 turtle.penup() turtle.goto(-10, 100) turtle.pendown() turtle.begin_fill() turtle.circle(5) turtle.end_fill() # 绘制熊猫的嘴巴 turtle.penup() turtle.goto(-30, 70) turtle.pendown() turtle.setheading(-60) turtle.circle(30, 120) # 绘制熊猫的身体 turtle.penup() turtle.goto(-100, -50) turtle.pendown() turtle.begin_fill() turtle.circle(80) turtle.end_fill() # 绘制熊猫的左手 turtle.penup() turtle.goto(-170, -50) turtle.pendown() turtle.begin_fill() turtle.circle(30) turtle.end_fill() # 绘制熊猫的右手 turtle.penup() turtle.goto(70, -50) turtle.pendown() turtle.begin_fill() turtle.circle(30) turtle.end_fill() # 绘制熊猫的左脚 turtle.penup() turtle.goto(-100, -150) turtle.pendown() turtle.begin_fill() turtle.circle(40, extent=180) turtle.goto(-100, -150) turtle.end_fill() # 绘制熊猫的右脚 turtle.penup() turtle.goto(20, -150) turtle.pendown() turtle.begin_fill() turtle.circle(40, extent=180) turtle.goto(20, -150) turtle.end_fill() # 隐藏笔 turtle.hideturtle() # 等待用户关闭窗口 turtle.done() ``` 运行这段代码会在窗口中绘制出一只可爱的熊猫。如果想要调整熊猫的大小、位置或颜色等属性,可以修改代码中的相应参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python小二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值