使用python实现代码动画视频

前言

最近在CSDN上面看到一个将视频转换为由代码组成的视频,所以想自己写一个。参考的原文博客为:https://blog.csdn.net/hhladminhhl/article/details/118463344

功能:使用python实现将动画转换为有字符组成的视频。
实现方法分为如下几步:
1、将视频从网站上面下载下来
2、将视频截取为GIF,把截取的GIF进行ASCII字符转换
3、将转换好的字符gif根据每一帧的顺序进行重命名,然后排序
4、将排序后的每一帧gif图片转换为jpg图片
5、将字符图片合成视频

实现步骤

1、准备阶段

想要将视频制作出来,我们想要用到如下几个工具:
(1)、将视频下载下来的工具,我这里使用的是you-get。
you-get安装方法:
下载的命名:

pip install you-get

下载you-get截图:


确认you-get下载成功截图:

(2)、将视频转换为GIF图的工具,我这里使用的是迅捷视频转换器。
迅捷视频转换器下载地址:https://www.xunjieshipin.com/video-converter
迅捷视频转换器使用界面截图:

(3)、将GIF转换为字符的工具,我这里使用的是ASCII Animator
ASCII Animator下载地址:http://www.qqpr.com/
(4)、在文件中需要使用到的库:cv2、os、opecv-python
下载需要使用的命名:

pip install cv2  # 用于处理图像的库
pip install os  # 用于处理文件的库
pip install opencv-python   # 用于处理图像的库

2、下载视频

通过you-get将视频下载到本地,我这里使用的是《如果历史是一群喵第六季》的op。
《如果历史是一群喵第六季》视频链接:
https://www.bilibili.com/bangumi/play/ep399825
下载视频使用的命令:

you-get -o 本地保存路径 视频链接

下载视频过程截图:

这样我们就成功将视频下载到本地

3、截取GIF图

接下来将下载后的视频进行GIF截取,我这里使用的是迅捷视频转换器。注意:截取视频时长尽量不能太长,否则在进行ASCII转换时会因为内存不够而报错,每次截取3s。
迅捷视频转换器截取GIF过程截图:


将截取出来的gif文件安装顺序1、2、3将gif命名。

4、将GIF转换为ASCII

使用ASCII Animator将截取的GIF每一帧图片转换为ASCII。注意:需要设置每100个像素宽度的字符数(我设置的是75)和输出类型选择动画ASCII(.gif)。
使用ASCII Animator截图。由于转换后图片占用内存太大,所以只用一个gif进行举例。

我们可以在输出路径里面找到gif每一帧转换的ASCII的gif,将gif复制到python项目下material/img文件夹中,以便后续的处理(在复制文件时按照自己的需求确定复制路径)。

5、gif文件重命名

思路:使用os.listdir(path)读取路径下所有的文件名称,然后通过for遍历每一个文件、使用os.rename(src, dst)对文件重命名。
实现代码:

# 导入包
import os
import cv2
from PIL import Image# 定义重命名的函数
def rename_gif(gif_path):"""定义重命名的函数:param gif_path: gif图片存储的路径:return:"""# 使用os.listdir(path)读取路径下所有的文件名称file_list = os.listdir(gif_path)# 使用len()获取文件夹下文件的数量n = len(file_list)# 使用for循环遍历文件夹下的所有文件for i in range(n):s = str(file_list[i])   # 获取第i个文件的名称src = gif_path + s      # 重命名前名称dst = gif_path + s[8: 10] + s[-4:]  # 重命名后名称os.rename(src, dst)     # 对文件重命名rename_gif('./material/img/') # 调用重命名函数

gif重命名后,所有的gif已经按照每一帧的顺序排列好了,后续处理时按照图片名称进行处理就行了。
重命名后的图片:

6、将gif转换为jpg图片

按照帧顺序排列的gif转换为jpg图片。注意:不能直接将文件后缀名该为jpg,那样文件格式还是没有变,使用cv2读取时会为空。
思路:
1、使用os.listdir(path)读取路径下所有的文件名称
2、使用Image.open(path)读取gif格式的图片
3、使用im.convert(‘RGB’)将图片格式转换为jpg格式
4、使用frame.save()将转换后的图片写回文件夹。
实现的代码:

# 导入包
import os
import cv2
from PIL import Image# 定义用于迭代图片数据的函数
def iter_frames(im):try:i = 0while 1:im.seek(i)imframe = im.copy()if i == 0:palette = imframe.getpalette()else:imframe.putpalette(palette)yield imframei += 1except EOFError:pass# 定义将gif图片转换为jpg图片的函数
def gif2jpg(gif_path, jpg_path):"""定义将gif图片转换为jpg图片的函数:param gif_path: 存储gif图片的路径:param jpg_path: 存储jpg图片的路径:return:"""# 获取所有gif图片名称file_list = os.listdir(gif_path)# 将图片排序,以名称字符串的数字进行排列file_list.sort(key=lambda x: int(x[: -4]))# 使用for循环读取所有的gif图片for img in file_list:# 判断是否为gif格式的图片if img[-4:] == '.gif':im = Image.open(gif_path + img)    # 打开图片im = im.convert('RGB')  # 转换格式# 当存储jpg图片的路径不存在时创建路径if not os.path.exists(jpg_path):os.makedirs(jpg_path)# 进行图片的转换for i, frame in enumerate(iter_frames(im)):frame.save(jpg_path + img[0: -4] + '.jpg', **frame.info)gif2jpg('./material/img/', './img/')    # 调用将gif转换为jpg的函数

转换后的图片:

7、将图片合成视频

思路:
1、使用os.listdir(path)读取路径下所有的文件名称
2、使用cv2.VideoWriter_fourcc(‘m’, ‘p’, ‘4’, ‘v’)确定视频格式为.mp4
3、使用Image.open(path)打开一张图片,用于确定合成视频的宽度和高度。
4、使用cv2.VideoWriter(video_path, fourcc, fps, im.size)创建视频,video_path确定视频存储路径,fourcc确定视频格式,fps确定视频每一秒帧数,im.size确定视频宽度和高度。
5、使用cv2.imread(path)读取需要插入视频的图片
6、使用video_writer.write(frame)将图片写入视频中。
7、使用video_writer.release()将视频释放。
实现过程的代码:

# 导入包
import os
import cv2
from PIL import Image# 定义图片转换为视频的函数
def jpg2video(jpg_path, video_path):"""定义图片转换为视频的函数:param jpg_path: jpg图片所在文件夹:param video_path: 视频存储路径:return:"""# 使用os.listdir(path)获取所有jpg图片名称jpg_list = os.listdir(jpg_path)# 将图片排序,以名称字符串的数字进行排列jpg_list.sort(key=lambda x: int(x[: -4]))fps = 21    # 定义每一秒的帧数# 视频格式为mp4格式fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')im = Image.open(jpg_path + jpg_list[0])   # 打开第一张图片# 设置写入视频的要求,参数(写入的路径, 格式, 每一秒的帧数,视频宽高)video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)print(jpg_list)# 使用for循环将图片写入视频中for jpg_i in jpg_list:frame = cv2.imread(jpg_path + jpg_i)    # 使用cv2导入图片print('开始将' + jpg_i + '加入视频')video_writer.write(frame)   # 将图片加入视频video_writer.release()  # 释放video_writerjpg2video('./img/', './video.mp4')      # 调用图片转换为视频函数

最终的效果:

8、完整的代码

"""
功能:将图片合成一个视频
"""
# 导入包
import os
import cv2
from PIL import Image# 第一步将gif图像重命名
# 定义重命名的函数
def rename_gif(gif_path):"""定义重命名的函数:param gif_path: gif图片存储的路径:return:"""# 使用os.listdir(path)读取路径下所有的文件名称file_list = os.listdir(gif_path)# 使用len()获取文件夹下文件的数量n = len(file_list)# 使用for循环遍历文件夹下的所有文件for i in range(n):s = str(file_list[i])   # 获取第i个文件的名称src = gif_path + s      # 重命名前dst = gif_path + s[8: 10] + s[-4:]  # 重命名后os.rename(src, dst)     # 对文件重命名# 第二步将gif图片转换为jpg图片
# 定义用于迭代图片数据的函数
def iter_frames(im):try:i = 0while 1:im.seek(i)imframe = im.copy()if i == 0:palette = imframe.getpalette()else:imframe.putpalette(palette)yield imframei += 1except EOFError:pass# 定义将gif图片转换为jpg图片的函数
def gif2jpg(gif_path, jpg_path):"""定义将gif图片转换为jpg图片的函数:param gif_path: 存储gif图片的路径:param jpg_path: 存储jpg图片的路径:return:"""# 获取所有gif图片名称file_list = os.listdir(gif_path)# 将图片排序,以名称字符串的数字进行排列file_list.sort(key=lambda x: int(x[: -4]))# 使用for循环读取所有的gif图片for img in file_list:# 判断是否为gif格式的图片if img[-4:] == '.gif':im = Image.open(gif_path + img)    # 打开图片im = im.convert('RGB')  # 转换格式# 当存储jpg图片的路径不存在时创建路径if not os.path.exists(jpg_path):os.makedirs(jpg_path)# 进行图片的转换for i, frame in enumerate(iter_frames(im)):frame.save(jpg_path + img[0: -4] + '.jpg', **frame.info)# 第三步将图片转换为视频
# 定义图片转换为视频的函数
def jpg2video(jpg_path, video_path):"""定义图片转换为视频的函数:param jpg_path: jpg图片所在文件夹:param video_path: 视频存储路径:return:"""# 使用os.listdir(path)获取所有jpg图片名称jpg_list = os.listdir(jpg_path)# 将图片排序,以名称字符串的数字进行排列jpg_list.sort(key=lambda x: int(x[: -4]))fps = 21    # 定义每一秒的帧数# 视频格式为mp4格式fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')im = Image.open(jpg_path + jpg_list[0])   # 打开第一张图片# 设置写入视频的要求,参数(写入的路径, 格式, 每一秒的帧数,视频宽高)video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)print(jpg_list)# 使用for循环将图片写入视频中for jpg_i in jpg_list:frame = cv2.imread(jpg_path + jpg_i)    # 使用cv2导入图片print('开始将' + jpg_i + '加入视频')video_writer.write(frame)   # 将图片加入视频video_writer.release()  # 释放video_writer# rename_gif('./material/img/') # 调用重命名函数
#gif2jpg('./material/img/', './img/')    # 调用将gif转换为jpg的函数
jpg2video('./img/', './video.mp4')      # 调用图片转换为视频函数

使用python实现代码动画视频相关推荐

  1. python制作代码舞视频来啦~

    上一篇文章我们介绍了如何制作字符画视频,今天就来给大家介绍一下代码舞的视频制作 最后效果展示 首先是原版 接着是黑白版的 最后是彩色版的 是不是看着很nice呢,哈哈哈哈 项目实现 第一步 首先我们要 ...

  2. OpenCV 标定摄像头(Python 版本代码,视频中标定,亲测可用)

    在机器视觉领域,摄像头的标定指通过技术手段拿到相机的内参.外参及畸变参数. 相机内参长这样,利用针孔模型,将 3d 物体透视投影到 2d 的相机屏幕上. P = [ f x 0 c x 0 f y c ...

  3. 两行Python代码调整视频的亮度

    ☞ ░ 老猿Python博文目录 ░ 一.引言 最近看到好几篇类似"n行Python代码-"的博文,看起来还挺不错,简洁.实用,传播了知识.带来了阅读量,撩动了老猿的心,决定跟风一 ...

  4. 两行Python代码实现视频的淡入淡出处理

    ☞ ░ 老猿Python博文目录 ░ 一.引言 最近看到好几篇类似"n行Python代码-"的博文,看起来还挺不错,简洁.实用,传播了知识.带来了阅读量,撩动了老猿的心,决定跟风一 ...

  5. 用Python做个小仙女代码蹦迪视频

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...

  6. 用 Python 做个小姐姐代码蹦迪视频

    前言 最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开! 看着仙紫小姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把小仙女的蹦迪视频转成代码舞呢? 说干就干,今天 ...

  7. 我用 Python 做了个小仙女代码蹦迪视频

    来源: https://blog.csdn.net/hhladminhhl/article/details/118463344 前言 最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久 ...

  8. python红色的颜色表达式_50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)...

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...

  9. 一个简单的Python樱花飘落动画代码

    以下是一个简单的Python樱花飘落动画代码示例: import random import time# 定义控制台大小和颜色 WIDTH = 80 HEIGHT = 25 COLORS = ['\0 ...

最新文章

  1. MySQL性能测试工具 mysqlslap
  2. manage.py命令
  3. win10pin不可用进不去系统_华为鸿蒙系统来了!若安卓不可用,鸿蒙随时顶上!
  4. OpenLayers辅助函数Util.js(三)
  5. Nginx 安装配置【必须把文件到放到机器上】
  6. ASP.NET里创建Microsoft Word文档
  7. ssm(Spring+Spring mvc+mybatis)mybatis配置文件——mybatis-config.xml
  8. 讨论群问题:Linux 下的批量操作,第2种很赞
  9. r语言 计算模型的rmse_直播丨R语言与作物模型高级应用实战技术应用
  10. python学习笔记(十一):网络编程
  11. 秒杀系统设计中的业务性思考
  12. 使用Redis存取数据+数据库存取(spring+java)
  13. Vmware 安装 Fedora 18 注意事项
  14. nodejs后台系列--第三篇-最简单的全栈demo:koa2+mysql+vue
  15. 6步搞定To B产品竞品分析,值得收藏!
  16. 处于停机等非正常状态_汽轮机运行最重要的启动与停机阶段,你得了解这些实际经验...
  17. 机电传动控制 第三周作业
  18. 图论 二分图 小世界网络 语义网络
  19. foobar2000后台运行
  20. u3d:200个插件免费分享

热门文章

  1. LLVM是如何编译指令的
  2. python+pycharm+mysql+sqlyog下载安装
  3. 诞生272年后,这个看似简单的数学问题终求得闭式解
  4. Java基础JDK命令行工具(jps,jstat,jinfo,jmap,jhat,jstack)
  5. NBA Finals
  6. 车辆排队叫号管理系统案例
  7. Gnuradio+uhd驱动软件安装流程
  8. IP组播协议——IGMP协议之IGMPv1
  9. 2012年1月凯立德地图普高清全分辨率懒人包P1750-D5616-2721J09(完美破解,已上路实测,永久下载地址)...
  10. 数据库设计查询题目练习