项目由来
Github链接,各位好兄弟要是开心,给作者打个星吧,求求了
当作者坐在教室,作者此时收到了老师的指令,于是作者打开了GitHub寻找“灵感”,作者看着满目的大作,不禁羞愧难当,想着自己要是也能在这里留下点什么就好了。于是作者冥思苦想,作者绞尽脑汁,可是作者啥也想不到。正此时,作者想到了,当他刚学编程时,他啥也不会感觉什么都很神奇,特别是他在csdn上看到什么sleep指令可以暂停,又一个指令可以清除输出的内容,于是他想到了,这不就可以通过实现快速重复输出一帧一帧的内容实现动画的效果吗?所有此时他做了第一个动画,过程非常的艰难,因为我们都知道动画是一帧一帧的,我们要实现就要一帧一帧的去写对应的字符集来实现动画,如下,作者的第一个动画(不堪入目)。
void she2q()
{
printf("\t\t\t ___\n");
printf("\t\t\t 【!】\n");
printf("\t\t\t 【!】 @\n");
printf("\t\t\t 【!】 @\n");
printf("\t\t\t 【 】 @\n");
printf("\t\t\t (|)\n");
printf("\t\t\t | |\n");
printf("\t\t\t | |\n");
printf("\t\t\t | |\n");
printf("\t\t\t O| |O\n");
}
放一个片段,代码总长达200行,动画很简单,但是字符集却很难画,具体动画是什么作者不多说了,年少轻狂作者不懂事,罪过罪过。
Python实现图像转换
可见,实现字符动画最难的就是每一帧字符的创作,所以已经在大学混迹了两年多的作者想到了python的图像处理模块,假设我们现在已有一张坤坤的gif文件(视频也可以),如下:
我们就可以通过python获取它的灰度图,进而获取灰度矩阵,接着通过字符映射,将灰度矩阵转换成对应的字符矩阵,然后我们直接就省去了,实现字符动画的主要工作,相当于是,用了作者的这个模板,调整一下参数直接就能实现字符动画,系不系十分的方便。
以下是效果图,不知道为什么在这里展示比实际效果要差,兄弟们可以自己去试试哦!
看到这里你不去Github上给可爱又有趣的作者点个star吗,所有文件均开源在Github
接下来是完整python代码(更改图片像素参数length,width就能实现其他图片的字符动画转换):
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
length = 532
width = 349
# 定义字符集,根据需要自定义
char_set = "❶❺❽❺"
# 加载 GIF 文件
gif_path = "D:/Ikun/ikun.gif"#注意放对位置,或者你直接改地址
gif = Image.open(gif_path)
# 遍历每一帧
frames = []
for frame_index in range(64):
# 选择当前帧
gif.seek(frame_index)
# 将图像转换为灰度
gray_frame = gif.convert("L")
# 将灰度图像转换为灰度矩阵
gray_matrix = np.array(gray_frame)
# 处理当前帧的灰度矩阵,例如进行字符图形转换
# 定义一个空字符串变量来存储字符图形
char_image = ""
# 遍历灰度矩阵的每个像素
for row in gray_matrix:
for pixel in row:
# 根据灰度值选择对应的字符
# 计算灰度值在字符集中的索引,将灰度值映射到字符集的范围内
index = int(pixel // (255 // len(char_set)))
# 将对应的字符添加到字符图形中
char_image += char_set[index]
char_image += "\n" # 在行末添加换行符
# 将当前字符图形添加到帧列表中
frames.append(char_image)
print('图像已分解完毕!')
# 打印第一帧的字符图形
#print(frames[0])
# 定义要保存的文件路径
output_file = "D:/Ikun/char_image.txt"
# 将字符图形写入到文件中
for i in frames:
with open(output_file, "a+",encoding="utf-8") as file:
file.write(i)
print("字符图形已保存到文件:", output_file)
import tkinter as tk
def show_file_content():
# 定义每批次输出的行数
batch_size = width#行像素
# 定义文件路径
file_path = "D:/Ikun/char_image.txt"
# 创建新的窗口
window = tk.Tk()
# 设置窗口全屏显示
window.attributes('-fullscreen', True)
# 创建文本框
text_box = tk.Text(window, font=("Arial", 1))
text_box.pack(fill=tk.BOTH, expand=True)
# 读取文件内容
with open(file_path, "r", encoding="utf-8") as file:
content = file.readlines()
cnt = 0
while 1:
cnt+=1
if cnt>=2:
break
# 循环输出每批次的行数
for i in range(0, len(content), batch_size):
# 获取当前批次的行数内容
batch = content[i:i+batch_size]
# 将当前批次的内容添加到文本框中
text_box.insert(tk.END, "".join(batch))
text_box.see(tk.END) # 滚动到文本框的末尾
text_box.update() # 更新文本框的显示
# 删除已经显示的内容
text_box.delete("1.0", tk.END)
# 等待一段时间再继续显示下一个批次的内容
window.after(24) # 暂停1秒
window.after(500, window.destroy)
# 进入窗口的主循环
window.mainloop()
# 调用函数显示文件内容
show_file_content()