本文正在参加「Python主题月」,详情查看 活动链接
作者:JavaGieGie
微信公众号:Java开发零到壹
前言
昨天看了关于党的一百岁生日的相关新闻,不吹不黑,花Gie激动到老泪纵横,这个一百年,我们太不容易了,这是无数先辈用生命换来的,身为当代青年,小伙伴们务必珍惜,此生无悔入华夏这句话是很多小伙伴的口头禅,也是花Gie的最爱!为祖国,吾辈奋进!
于是想到了以前看过社区大佬敖丙的一篇文章思路,就想着自己动手也把视频输出成动画,来看看效果如何。
正文
视频抽帧
以前做过一段时间视频剪辑,所以对Pr(Adobe Premiere Pro 2020)的使用也是挺熟练的,多才多艺的花Gie此时很得意。
想要导出剪辑好的视频,步骤如下:点击文件 -> 导出 -> 媒体,我这里格式选择了JPEG的格式,一共生成了586张图片。
转换图片到ASCII字符
这一步花费我了还挺长时间,因为百度了大概一个小时,还是没有找到合适的工具转换,一怒之下,就用python写了一个工具类。
from PIL import Image
import os
table = '#8XOHLTI)i=+;:,. '
path = r'图片所在目录'
for filename in os.listdir(path):
if filename.find(".txt") != -1:
continue
im = Image.open(os.path.join(path, filename))
if im.mode != "L":
im = im.convert("L")
a = im.size[0]
b = im.size[1]
destName = os.path.join(path, filename).replace(".jpg", ".txt")
f = open(destName, 'w+')
for i in range(1, b, 2):
line = ''
for j in range(a):
line += table[int((float(im.getpixel((j, i))) / 256.0) * len(table))]个字符
line += "\n"
f.write(line)
f.close()
复制代码
执行完这个工具类,就可以将五百多张图片全部转换成了txt文件。
合成为一个txt总文件
因为我们播放视频的时候,把生成的几百个txt文件,这里就有一个问题,因为原视频上下两部分有黑框,因此转换出来的txt也有大量的多余字符,所以合并时,专门对这部分进行了处理,合并代码如下。
from PIL import Image
import os
line_all = ''
table = '#8XOHLTI)i=+;:,. '
path = r'txt文件夹路径'
for filename in os.listdir(path):
if filename.find(".jpg") != -1:
continue
with open(os.path.join(path, filename)) as file_obj:
index = 1
line = ''
for content in file_obj:
if 137 < index < 343: //只保留第137到343行数据
line += content + "\n"
index = index + 1
line_all += line
destName = "合并总文件路径"
f = open(destName, 'w+')
f.write(line_all)
f.close()
复制代码
GUI界面编写
加下来的事情就是使用tkinter
把总txt文件的字符进行输出,我这次找的视频在处理完后,每一屏的大小为410行,为了兼容我自己电脑的大小,所以调整了字体大小,小伙伴们自己动手做的时候也要根据实际情况来调整,字体选择宋体
,代码如下。
import tkinter as tk
import os
import tkinter.font as tf
class Questions(tk.Tk):
def __init__(self, *args, **kw):
super().__init__()
self.wm_title('1921-2021')
self.configure(background='white')
self.wm_minsize(1200,1400) # 设置窗口最小化大小
self.wm_maxsize(1200,1400) # 设置窗口最大化大小
self.resizable(width=False, height=True) # 设置窗口宽度不可变,高度可变
ft = tf.Font(family='宋体', size=1) # 设置字体
self.text = tk.Text(self,width=1200, height=300,font = ft)
# self.text.tag_add('tag1', '1.10', '1.12')
# self.text.tag_config('tag1', background='yellow', foreground='red')
self.text.pack()
self.index = 1
self.run()
self.refresh_data()
self.mainloop()
def refresh_data(self):
path = r'txt合并文件夹目录'
with open(os.path.join(path, "txt文件名")) as file_obj:
self.index = self.index +1
line = ''
for content in file_obj:
if self.index % 410 == 0:
self.text.delete(1.0, tk.END)
self.text.insert(1.410, line)
line = ''
self.index = self.index + 1
line = line + content + "\n"
self.after(50, self.refresh_data) # 这里的50毫秒刷屏一次
def run(self):
pass
if __name__ == '__main__':
question = Questions()
复制代码
这里有几个注意点,都是花Gie踩过的:
- 窗口宽高、文本区宽高、字体大小要按比例对应,不然看不出效果
- windows系统,字体选择宋体;Mac系统,选择Andale Mono
- 开始尝试了很多方式,文本内容就是不能实时刷新,对
tkinter
不大熟悉导致,最后用了现在这种after按照一定频率调用自身来实现 - 每次输出的行数,就是原单个文件的行数
- 查看txt文件是,使用Ctrl+滚动轴 将字体缩小配合,就可以查看出效果
效果展示
总结
看完上面,估计会有不少小伙伴心中在想,这上面的东西我都会,太小儿科了。如果你也是这么想的,评论区直接怼我我,我肯定虚心求教,作为新时代的中老年,我们应该接下重任,实现接力!加油!小伙伴们。
以上就是本期全部内容,如有纰漏之处,也请小伙伴们留言订正。我是花Gie ,有问题大家随时留言讨论 ,我们下期见?。
文章持续更新,可以微信搜一搜「 Java开发零到壹 」第一时间阅读,后续会持续更新Java面试和各类知识点,有兴趣的小伙伴欢迎关注,一起学习,一起哈??。
原创不易,如果你觉得这篇文章对你有点用的话,麻烦你为本文点个赞、评论或转发一下,因为这将是我输出更多优质文章的动力,感谢!