• 使用Python制作内马尔的胜利之舞代码版


    不知道大家最近有没有被球星内马尔所吸引,反正我是对他的胜利之舞上瘾了。今天,我以程序猿的视角将他的胜利之舞做成代码版的视频。话不多说,先看看最终效果图:

     

    哈哈哈哈,是不是看着还不错的样子。

    之前我做过类似的教程:python制作代码舞视频来啦~还做过字符画视频的教程:python制作字符画视频来啦~

    下面开始上教程!

    1.找视频

    我这里找的视频是在某音上下载的,大家可在其他平台下载即可。

    2.将视频转为gif图片形式

    视频转化为gif的方式途径有很多,我这里是在这个网站里面转化的

    3.借助工具将gif图片转化为代码图片

    在这里我们需要借助到一个工具,叫ASCII Animator,可在百度自行下载

    第一个框框是图片的位置,第二个框框是文件输出的位置,一般不需要改,上传图片后,我们点击Settings选项

    Output type有三个选项,第一个是生成一个html文件,第二个是生成黑白的代码gif图片,第三个是生成彩色的gif图片,同时在它的输出路径下有一个temp文件。里面存放的就是gif图片每一帧的图片 

    4.使用python将temp文件夹里面的每一帧图片合成mp4视频 

    1. import os
    2. import re
    3. import cv2
    4. from PIL import Image
    5. def rename_gif(gif_path): # temp_path 是你存放gif和bmp文件的路径文件夹,也就是temp文件夹的路径
    6. file_list = os.listdir(gif_path) # 读取当前文件夹所有文件
    7. n = len(file_list)
    8. for i in range(n):
    9. s = str(file_list[i])
    10. if s[-4:] == ".gif": # 检查后缀
    11. res = re.findall(r"\d+", s) # 获取它的顺序值
    12. src = os.path.join(os.path.abspath(gif_path), s) # 原先的图片名字
    13. dst = os.path.join(os.path.abspath(gif_path), res[0] +'.gif') # 根据自己的需要重新命名
    14. os.rename(src, dst) # 重命名,覆盖原先的名字
    15. else:
    16. os.remove(gif_path + s) # 删除.bmp文件
    17. def iter_frames(im):
    18. try:
    19. i= 0
    20. while 1:
    21. im.seek(i)
    22. imframe = im.copy()
    23. if i == 0:
    24. palette = imframe.getpalette()
    25. else:
    26. imframe.putpalette(palette)
    27. yield imframe
    28. i += 1
    29. except EOFError:
    30. pass
    31. def gif2img(gif_path):
    32. gifs = os.listdir(gif_path)
    33. gifs.sort(key=lambda x: int(x[:-4])) # 以名称字符串的数字从小到大排序
    34. for gif in gifs:
    35. im = Image.open(gif_path+gif) # 打开gif格式的图片
    36. im = im.convert('RGB')
    37. if not os.path.exists('./img'):
    38. os.makedirs('./img')
    39. for i, frame in enumerate(iter_frames(im)):
    40. frame.save('./img/' + gif[0:-4] + '.jpg', **frame.info) # 保存成jpg格式
    41. def charts2video(img_path, video_path):
    42. """将给定目录下的图片转成视频
    43. Args:
    44. img_path: 图片路径
    45. video_path: 输出视频的路径和名称
    46. Returns: 图片转成的视频
    47. """
    48. images = os.listdir(img_path)
    49. images.sort(key=lambda x: int(x[:-4])) # 以名称字符串的数字从小到大排序  
    50. fps = 12 # 帧数
    51. fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
    52. im = Image.open(img_path + images[0])
    53. video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
    54. for img_i in images:
    55. frame = cv2.imread(img_path + img_i)
    56. print('开始将 ' + img_i + ' 加入视频\n')
    57. video_writer.write(frame) # 注意:图片尺寸必须和视频尺寸一样,不然不会被加入视频中!!!
    58. video_writer.release()
    59. if __name__ == '__main__':
    60. gif_path = './temp/' # gif文件的路径
    61. video_path = '合成后的视频.mp4' # 要保存的视频路径
    62. # 修改.gif文件的名字
    63. rename_gif(gif_path)
    64. # 将.gif文件转换为.jpg文件
    65. gif2img(gif_path)
    66. # 将.jpg文件转换为.mp4文件
    67. charts2video('./img/',video_path)

     注意:我这里的代码路径是py文件和temp文件在同一目录下运行

    运行之后就得到合成后的mp4代码舞视频啦

  • 相关阅读:
    MySQL总结(DDL、DML、TPL、DCL)
    JavaCV + FFmpeg 播放音视频
    LINK : fatal error LNK1104: 无法打开文件“python310.lib”解决方案
    程序化交易是科学和艺术的结合
    信息学奥赛一本通——1899:【17NOIP提高组】小凯的疑惑
    【从零开始的Java开发】2-8-3 CSS浮动:DIV、盒子模型、浮动
    【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )
    excel内容通过apache poi读取后读出来为数字,转为日期类型
    操作系统抢占、非抢占式内核的区别
    UE4 关卡蓝图实现开关门
  • 原文地址:https://blog.csdn.net/m0_64336780/article/details/128209603