【全球最帅的人】在Python中原来长这样|Python 主题月

本文正在参加「Python主题月」,详情查看 活动链接

作者:JavaGieGie

微信公众号:Java开发零到壹

前言

昨天看了关于党的一百岁生日的相关新闻,不吹不黑,花Gie激动到老泪纵横,这个一百年,我们太不容易了,这是无数先辈用生命换来的,身为当代青年,小伙伴们务必珍惜,此生无悔入华夏这句话是很多小伙伴的口头禅,也是花Gie的最爱!为祖国,吾辈奋进!

于是想到了以前看过社区大佬敖丙的一篇文章思路,就想着自己动手也把视频输出成动画,来看看效果如何。

正文

视频抽帧

以前做过一段时间视频剪辑,所以对Pr(Adobe Premiere Pro 2020)的使用也是挺熟练的,多才多艺的花Gie此时很得意。

image.png

想要导出剪辑好的视频,步骤如下:点击文件 -> 导出 -> 媒体,我这里格式选择了JPEG的格式,一共生成了586张图片。
image.png

转换图片到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文件。

image.png

合成为一个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+滚动轴 将字体缩小配合,就可以查看出效果

效果展示

WeChat_20210702153742 (1).gif

总结

看完上面,估计会有不少小伙伴心中在想,这上面的东西我都会,太小儿科了。如果你也是这么想的,评论区直接怼我我,我肯定虚心求教,作为新时代的中老年,我们应该接下重任,实现接力!加油!小伙伴们。

以上就是本期全部内容,如有纰漏之处,也请小伙伴们留言订正。我是花Gie ,有问题大家随时留言讨论 ,我们下期见?。

文章持续更新,可以微信搜一搜「 Java开发零到壹 」第一时间阅读,后续会持续更新Java面试和各类知识点,有兴趣的小伙伴欢迎关注,一起学习,一起哈??。

原创不易,如果你觉得这篇文章对你有点用的话,麻烦你为本文点个赞、评论或转发一下,因为这将是我输出更多优质文章的动力,感谢!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享