前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >带音乐字符画+带颜色字符画—情人节表白代码

带音乐字符画+带颜色字符画—情人节表白代码

作者头像
阿黎逸阳
发布2021-08-18 10:56:01
1K0
发布2021-08-18 10:56:01
举报
文章被收录于专栏:阿黎逸阳的代码

最近奥运会开得如火如荼,奥运健儿吸引了我所有的目光。所以公众号就暂时搁置了,随着奥运会结束,公众号也是该回阳的时候了。

昨天是一年一度的七夕,很多小伙伴都度过了一个甜蜜的日子。

没有另一半的也不要气馁呀,好好提升自己,相信在不久的将来,你也会遇到自己生命中那个唯一的伴侣。

本来想昨天把这篇文章送给大家,但是昨天要出门看望一个生病的朋友,所以就拖到今天啦,希望大家喜欢。

本文目录

  1. 带音乐字符画和带颜色字符画效果展示 1.1 带颜色字符画效果展示 1.2 带音乐字符画效果展示
  2. 带颜色字符画生成过程 2.1 下载要转换成字符的视频 2.2 把视频中固定间隔的帧取出来做成图片 2.3 把视频中截取的图片转成字符图片 2.4 把转成字符的图片连接起来生成动图
  3. 带音乐字符画生成

一、带音乐字符画和带颜色字符画效果展示

之前看到有人在微博上用一些软件生成了树开花的视频,总想着下次我也要用python实现玩玩。

终于在研究了一段时间后实现了,感谢网上前辈一些资料的提示,大家也可以借由这篇文章的灵感,实现属于你的字符画。

在正式进入代码讲解之前,先来看下本文的实现效果。

1 带颜色字符画效果展示

视频中的字符可以替换成你想替换的名字缩写,我用的是杨紫的首字母缩写。

2 带音乐字符画效果展示

视频中的字符可以替换成你想替换的名字缩写,在开始和结束页可以把你想说的话替换固定字符,也可以是你写的一封信。

二、带颜色字符画生成过程

带颜色字符画的大致生成过程:确定视频——把视频中固定间隔的帧截取出来生成带颜色的字符图片——合并成字符画gif。

若需要从网上下载没有下载按钮的视频,分享大家如下方法。

1 下载要转换成字符的视频

首先在视频播放页面按F12(或者点击页面右上方红框中的三个点,找到更多工具,再点击开发人员工具)。

接着点击带箭头的红框,再点击要下载的视频,右边会自动定位。

然后点击鼠标右键,点击编辑为HTML,即可出现下图中的大红框,再复制小红框src中的链接。

在浏览器中打开,再点击右下角的三个点,即可出现下载按钮。

最后把下载好的视频,存到特点目录即可。

2 把视频中固定间隔的帧截取出来生成图片

把刚刚下载好的视频存放到电脑某个文件夹中,并让下面代码中的路径和存储路径一致即可。

代码语言:javascript
复制
import os
import cv2
import numpy as np
# 导入所需要的库

os.chdir(r'F:\公众号\36.彩色字符号') 
#设置视频存放的地址   ***需替换成你电脑存放视频的文件目录***
video_capture = cv2.VideoCapture("rose.mp4")
# 读取视频文件        ***需替换成你的视频名称***
success, frame = video_capture.read()  
timeF = 5
#设置固定帧率,视频每隔多少秒打印一下图片
i = 0
j = 0
while success :
    i = i + 1
    if (i % timeF == 0):
        j = j + 1
        address = 'image' + str(j)+ '.jpg'    
        cv2.imwrite(address,frame)
        #存储图片
        #print('save image:',j)
    success, frame = video_capture.read()

这个代码也可以应用到工作中,比如把视频中的内容截取出来,再自动识别出图片中的文字,做某种校验。

3 把视频中截取的图片转成字符图片

由于视频是在好看视频中下载的,所以图片右上方会带有特定字符。本文对图片进行了截取,处理了那些特殊字符,并把处理好的图片转换成字符图片。

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import os
import cv2
import time
import argparse
import numpy as np
import pygame as py
from tkinter import *
import matplotlib.pyplot as plt
from PIL import Image, ImageFont, ImageDraw
# 导入所需要的库


os.chdir(r'F:\公众号\36.彩色字符号') 
#设置存放文件的路径
ascii_char = list(u"YZILVU")
#替换成你喜欢的字符
def get_char(r,g,b,alpha = 256):
    #将像素转换为ascii码
    if alpha == 0:
        return ''
    length = len(ascii_char)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    unit = (256)/length
    return ascii_char[int(gray/unit)]
 
if __name__=='__main__': 
    for k in range(1, j):
        im = cv2.imread('image' + str(k)+ '.jpg',1)
        im = im[110:im.shape[0],0:im.shape[1]]
        cv2.imwrite('cut' + str(k)+ '.jpg',im)
        im =Image.open('cut' + str(k)+ '.jpg')
        WIDTH = int(im.width/4.5) 
        HEIGHT = int(im.height/7) 
        im_txt = Image.new("RGB",(im.width,im.height),(231,223,223))
        im = im.resize((WIDTH,HEIGHT),Image.NEAREST)
        txt = ""
        colors = []
        for i in range(HEIGHT):
            for j in range(WIDTH):
                pixel = im.getpixel((j,i))
                colors.append((pixel[0],pixel[1],pixel[2]))
                if(len(pixel) == 4):
                    txt += get_char(pixel[0],pixel[1],pixel[2],pixel[3])
                else:
                    txt += get_char(pixel[0],pixel[1],pixel[2])        
            txt += '\n' 
            colors.append((0,0,0))
        dr = ImageDraw.Draw(im_txt)
        font=ImageFont.load_default().font#获取字体
        x=y=0
        #获取字体的宽高
        font_w,font_h=font.getsize(txt[1])
        font_w *= 0.8
        font_h *= 0.7 #调整后更佳

        #ImageDraw为每个ascii码进行上色
        for i in range(len(txt)):
            if(txt[i]=='\n'):
                x+=font_h
                y=-font_w
            dr.text([y,x],txt[i],colors[i])
            y+=font_w
        #输出
        im_txt.save(r'.\videos_to_str_png\vedio_to_str_' + str(k)+ '.png', encoding='utf-8')
        #plt.imshow(im_txt)

4 把转成字符的图片连接起来生成动图

最后是把生成的字符图片连接成gif,输出到本地文件夹中。感兴趣的同学可以思考怎么不保存图片,直接生成gif。

代码语言:javascript
复制
import os
import imageio

def turn_gif(path, gif_filename):
    print('=====开始制作GIF=====')
    os.chdir(path)
    image_list = []
    num = len(os.listdir(path))
    for i in range(1,num-1):
        image_list.append('vedio_to_str_' + str(i)+ '.png')
    frames = []
    for image_name in image_list:
        frames.append(imageio.imread(image_name))
    imageio.mimsave(gif_filename, frames, 'GIF', duration=0.01)    
    print('=====GIF已制作完成=====')
    
turn_gif(r'F:\公众号\36.彩色字符号\videos_to_str_png', 'rose_video_to_str_gif.gif')

最终生成的效果图即为第一小节里介绍的视频1。

三、带音乐字符画生成

带音乐字符画生成过程和带颜色字符画生成过程类似,就不赘述了,有疑问的同学可以到公众号中私信我,本文直接把代码展示如下:

代码语言:javascript
复制
import os
import cv2
import numpy as np
# 导入所需要的库

os.chdir(r'F:\公众号\35.七夕字符画')
#设置视频存放的地址   ***需替换成你电脑存放视频的文件目录***
video_capture = cv2.VideoCapture("rose.mp4")
success, frame = video_capture.read()  
timeF = 10
i = 0
j = 0
while success :
    i = i + 1
    if (i % timeF == 0):
        j = j + 1
        address = 'image' + str(j)+ '.jpg'    
        cv2.imwrite(address,frame)
        #存储图片
        #print('save image:',j)
    success, frame = video_capture.read()
    
import os
import cv2
import time
import numpy as np
import pygame as py
from tkinter import *
from PIL import Image
# 导入所需要的库

os.chdir(r'F:\公众号\35.七夕字符画')
#ascii_char = list("$@杨%8&紫我#*喜欢你杨紫我喜欢你杨紫/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
ascii_char = list("$@B%8&WM#*yzyzyzyzwmZO0QLCJUYXzsyfurmflp/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")

#将256灰度映射到70个字符上,也就是RGB值转字符的函数:
def get_char(r, g, b, alpha=256):
    if alpha == 0:
        return ''
    length = len(ascii_char)
    gray = int(0.2126*r + 0.7152*g +0.0722*b)
    unit = (256.0 + 1)/length
    return ascii_char[int(gray/unit)]

width = 60  
height = 45 
if __name__=='__main__': 
    root = Tk()
    text = Text(root, width = 60, height = 45)
    text.pack()
    text.insert(INSERT, '时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;时光往复,爱你如初;')
    py.mixer.init()
    py.mixer.music.load(r'.\videos\轻音乐舒缓 (钢琴).mp3')
    py.mixer.music.play(-1, 0)
    root.update()
    text.delete(10.0, END)   
    for k in range(1, j):
        img = cv2.imread('image' + str(k)+ '.jpg',1)
        im = img[110:img.shape[0],0:img.shape[1]]
        cv2.imwrite('cut' + str(k)+ '.jpg',im)
        im =Image.open('cut' + str(k)+ '.jpg')
        im = im.resize((width, height),Image.NEAREST)
        txt = ''
        for i in range(height):
            for j in range(width):
                txt += get_char(*im.getpixel((j,i))) #获得相应的字符
            txt += '\n'
        #print(txt, end='') #打印出字符画
        #time.sleep(1)
        text.insert(INSERT, txt)
        root.update()
        text.delete(0.0, END)
    text.insert(INSERT, '花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期;花开有期,爱你无期。')
    root.update()
    text.delete(0.0, END)

至此,python生成字符画已展示完毕,感兴趣的朋友自己实现一遍吧,可以发挥你的创意生成个性化的表白字符画,给他/她一份独一无二的礼物。

参考文献

代码语言:javascript
复制
https://zhuanlan.zhihu.com/p/144256746
https://www.jb51.net/article/155379.htm
https://blog.csdn.net/qq_29726359/article/details/86774759
https://blog.csdn.net/qq_40502460/article/details/115293269
https://blog.csdn.net/sinat_29957455/article/details/85145488
https://blog.csdn.net/ljx1400052550/article/details/107410157
https://haokan.baidu.com/v?pd=wisenatural&vid=4882005920557419484
https://blog.csdn.net/qq_27802435/article/details/82423062?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.base&spm=1001.2101.3001.424
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿黎逸阳的代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档