如何用Python生成GIF动图?

要知道,除了用途广泛之外,Python自身也具备很强大的优势,入门门槛较低,具有丰富和强大的库。

它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。

那么,今天就带大家来了解下,如何用Python生成GIF动图?

其实,网上也有很多图片转 ascii art 的教程,不如我们就来试试看 gif 转 ascii art:

先来看看效果:

来看看怎么实现的:

要将gif图转换成字符画肯定先要知道如何将一张静态的图片转换成字符画简单来说是将一张图片的每个像素点的rgb值都转换成灰度值然后建立起灰度值和字符串的对应关系最后就能用字符串来表示像素啦

看看代码:

def rgb_to_ascii(r, g, b, alpha=256):

'''

通过灰度值的映射

将每一个rgb值对应成一个ascii符

也就实现了rgb -> ascii

'''

# 当像素透明时,直接返回一个空白字符串

if alpha == 0:

return ' '

length = len(ASCII_CHAR)

gray = int(0.299 * r + 0.587 * g + 0.114 * b)

# 灰度值和字符串的对应关系

# 每个字符串对应灰度值的区间是

unit = (256.0 + 1)/length

# 找到灰度值所对应字符串的下标

index = int(gray/unit)

return ASCII_CHAR[index]

def image_to_ascii_chart(image):

'''

# 图片转ascii图

先来说下实现原理:

# RGB

RGB色彩模式是通过对红(R)、绿(G)、蓝(B)

三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色

通常情况下,RGB各有256级亮度 其区间为[0,255] 也就是256个阶梯

# 灰度图

灰度图是指只含亮度信息,不含色彩信息的图象,

就象我们平时看到的黑白照片:亮度由暗到明,变化是连续的。

rgb向灰度值转换的公式是:

gray = 0.299r + 0.587g + 0.114b

所以灰度值的区间是 [0,(0.299+0.587+0.114)*255] ~> [0,255]

'''

width, height = image.size

text = ''

for y in range(height):

line = ''

for x in range(width):

# 找到对应位置的像素点

dot = image.getpixel((x, y))

line += rgb_to_ascii(*dot)

text += line

text += '\n'

return text

之后就是很简单的截取gif图里的每一帧,将每一帧都解析保存成字符串就好了

def gif_to_ascii_chart(path):

frames = list()

gif = Image.open(path)

imgs = [frame.copy() for frame in ImageSequence.Iterator(gif)]

for img in imgs:

image = img.convert("RGBA")

frames.append(image_to_ascii_chart(resize_img(image)))

return frames

Python里的屏幕刷新:

每一帧的图片都会以字符串的形式保存在内存里但是我们如何像真的gif图一样,展示它呢?

如果直接print出来,那肯定不是一个连续的动图在Python里想要在print的同时刷新屏幕一般是这样做的:

print('xxy',end='\r',flush=True)

可是这样只能做到单行刷新,不能刷新整个屏幕在经过一番搜索之后,我发现可以通过 ANSI码 来刷新整个屏幕

def clear_screen():

'''

ANSI 屏幕控制

'\033[2J' 代表清空屏幕

'''

print('\033[2J')

在学Python的小伙伴,不妨也可以自己尝试下去用Python生成GIF动图。其实也是挺有意思的呢~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191107A04PU200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券