千家信息网

如何使用Python代码制作动态鞭炮

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章给大家分享的是有关如何使用Python代码制作动态鞭炮的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果如下所示:动态鞭炮的基本原理是:将一个录制好的鞭炮视频以字符
千家信息网最后更新 2026年11月04日如何使用Python代码制作动态鞭炮

这篇文章给大家分享的是有关如何使用Python代码制作动态鞭炮的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    效果如下所示:

    动态鞭炮的基本原理是:将一个录制好的鞭炮视频以字符画的形式复现,基本步骤是帧采样 → 逐帧转换为字符画 → 字符画合成视频。下面开始吧!

    1 视频帧采样

    函数如下所示,主要功能是将视频的图像流逐帧保存到特定的缓存文件夹中(若该文件夹不存在会自动创建)。函数输入vp是openCV视频句柄,输出number是转换的图片数。

    def video2Pic(vp):    number = 0    if vp.isOpened():        r,frame = vp.read()        if not os.path.exists('cachePic'):            os.mkdir('cachePic')        os.chdir('cachePic')    else:        r = False    while r:        number += 1        cv2.imwrite(str(number)+'.jpg',frame)        r,frame = vp.read()    os.chdir("..")    return number

    2 将图片转为字符画

    2.1 创建像素-字符索引

    函数输入像素RGBA值,输出对应的字符码。其原理是将字符均匀地分布在整个灰度范围内,像素灰度值落在哪个区间就对应哪个字符码。字符码可以参考 ASCII码

    ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。其中:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

    RGBA是代表Red(红色)、Green(绿色)、Blue(蓝色)和Alpha的色彩空间,Alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的,而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。gray=0.2126 * r + 0.7152 * g + 0.0722 * b是RGB转为灰度值的经验公式,人眼对绿色更敏感。

    def color2Char(r,g,b,alpha = 256):    imgChar= list("#RMNHQODBWGPZ*@$C&98?32I1>!:-;. ")    if alpha:      gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)      unit = 256 / len(imgChar)      return imgChar[int(gray / unit)]    else:      return ''

    2.2 将图片逐像素转换为字符

    核心代码如下,遍历图片的每个像素

        img = Image.open(imagePath).convert('RGB').resize((imgWidth, imgHeight),Image.NEAREST)    for i in range(imgHeight):        for j in range(imgWidth):            pixel = img.getpixel((j, i))            color.append((pixel[0],pixel[1],pixel[2]))            txt = txt + color2Char(pixel[0], pixel[1], pixel[2], pixel[3]) if len(pixel) == 4 else \                  txt + color2Char(pixel[0], pixel[1], pixel[2])         txt += '\n'        color.append((255,255,255))

    3 将字符图像合成视频

    输入参数vp是openCV视频句柄,number是帧数,savePath是视频保存路径,函数中 MP42 是可以生成较小并且较小的视频文件的编码方式,其他类似的还有isom、mp41、avc1、qt等,表示"最好"基于哪种格式来解析当前的文件。

    def img2Video(vp, number, savePath):    videoFourcc = VideoWriter_fourcc(*"MP42")  # 设置视频编码器    asciiImgPathList = ['cacheChar' + r'/{}.jpg'.format(i) for i in range(1, number + 1)]    asciiImgTemp = Image.open(asciiImgPathList[1]).size    videoWritter= VideoWriter(savePath, videoFourcc, vp.get(cv2.CAP_PROP_FPS), asciiImgTemp)    for imagePath in asciiImgPathList:        videoWritter.write(cv2.imread(imagePath))    videoWritter.release()

    4 完整代码

    import cv2 from PIL import Image,ImageFont,ImageDrawimport osfrom cv2 import VideoWriter, VideoWriter_fourcc'''* @breif: 将像素颜色转换为ASCII字符* @param[in]: 像素RGBA值* @retval: 字符'''def color2Char(r,g,b,alpha = 256):    imgChar = list("#RMNHQODBWGPZ*@$C&98?32I1>!:-;. ")    if alpha:      gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)      unit = 256 / len(imgChar)      return imgChar[int(gray / unit)]    else:      return '' '''* @breif: 将视频逐帧转换为图片* @param[in]: vp -> openCV视频句柄* @retval: number -> 转换的图片数'''def video2Pic(vp):    number = 0    if vp.isOpened():        r,frame = vp.read()        if not os.path.exists('cachePic'):            os.mkdir('cachePic')        os.chdir('cachePic')    else:        r = False    while r:        number += 1        cv2.imwrite(str(number)+'.jpg',frame)        r,frame = vp.read()    os.chdir("..")    return number '''* @breif: 将图片逐像素转换为ASCII字符* @param[in]: imagePath -> 图片路径* @param[in]: index -> 图片索引* @retval: None'''def img2Char(imagePath, index):    # 初始化    txt, color, font = '', [], ImageFont.load_default().font    imgWidth, imgHeight = Image.open(imagePath).size    asciiImg = Image.new("RGB",(imgWidth, imgHeight), (255,255,255))    drawPtr = ImageDraw.Draw(asciiImg)    imgWidth, imgHeight = int(imgWidth / 6), int(imgHeight / 15)    # 对图像帧逐像素转化为ASCII字符并记录RGB值    img = Image.open(imagePath).convert('RGB').resize((imgWidth, imgHeight),Image.NEAREST)    for i in range(imgHeight):        for j in range(imgWidth):            pixel = img.getpixel((j, i))            color.append((pixel[0],pixel[1],pixel[2]))            txt = txt + color2Char(pixel[0], pixel[1], pixel[2], pixel[3]) if len(pixel) == 4 else \                  txt + color2Char(pixel[0], pixel[1], pixel[2])         txt += '\n'        color.append((255,255,255))        # 绘制ASCII字符画并保存    x, y = 0,0    fontW, fontH = font.getsize(txt[1])    fontH *= 1.37    for i in range(len(txt)):        if(txt[i]=='\n'):            x += fontH            y = -fontW        drawPtr.text((y,x), txt[i], fill=color[i])        y += fontW    os.chdir('cacheChar')    asciiImg.save(str(index)+'.jpg')    os.chdir("..")'''* @breif: 将视频转换为ASCII图像集* @param[in]: number -> 帧数* @retval: None''' def video2Char(number):    if not os.path.exists('cacheChar'):        os.mkdir('cacheChar')    img_path_list = ['cachePic' + r'/{}.jpg'.format(i) for i in range(1, number + 1)]     task = 0    for imagePath in img_path_list:        task += 1        img2Char(imagePath, task)'''* @breif: 将图像合成视频* @param[in]: vp -> openCV视频句柄* @param[in]: number -> 帧数* @param[in]: savePath -> 视频保存路径* @retval: None'''  def img2Video(vp, number, savePath):    videoFourcc = VideoWriter_fourcc(*"MP42")  # 设置视频编码器    asciiImgPathList = ['cacheChar' + r'/{}.jpg'.format(i) for i in range(1, number + 1)]    asciiImgTemp = Image.open(asciiImgPathList[1]).size    videoWritter= VideoWriter(savePath, videoFourcc, vp.get(cv2.CAP_PROP_FPS), asciiImgTemp)    for imagePath in asciiImgPathList:        videoWritter.write(cv2.imread(imagePath))    videoWritter.release()    if __name__ == '__main__':   videoPath = 'test.mp4'  savePath = 'new.avi'  vp = cv2.VideoCapture(videoPath)  number = video2Pic(vp)  video2Char(number)  img2Video(vp, number, savePath)  vp.release()

    感谢各位的阅读!关于"如何使用Python代码制作动态鞭炮"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

    字符 视频 像素 图片 图像 代码 鞭炮 函数 句柄 文件 动态 二进制 灰度 编码 路径 控制 输入 制作 不同 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网巨头反垄断金融科技 互联网科技金融 奇酷互联网科技公司 睿民互联网科技 新浪科技互联网 四川狮子座互联网科技 四个字互联网科技公司取名 互联网科技创新企业排名 小米互联网科技园设置 贵州叶脉互联网科技有限公司所属行业 互联网科技与大数据专业 互联网在线教育科技创业 科技大学互联网 互联网数据科技专业 山东子淼互联网科技有限公司 智帮互联网科技公司最近动向 南京一网一红互联网科技有限公司 福仕德教育科技互联网 绵阳真晨互联网科技有限公司 互联网科技对化妆品行业 广州百单互联网科技有限公司 科技制造互联网公司 万达互联网科技 互联网高科技股票 上海电发互联网科技有限公司 深圳市优智互联网科技有限公司 爱医互联网络科技 张家口科技产业互联网平台 安徽零酒互联网科技有限公司 知域互联网科技有限公司官网
    0