最近奥运会开得如火如荼,奥运健儿吸引了我所有的目光。所以公众号就暂时搁置了,随着奥运会结束,公众号也是该回阳的时候了。
昨天是一年一度的七夕,很多小伙伴都度过了一个甜蜜的日子。
没有另一半的也不要气馁呀,好好提升自己,相信在不久的将来,你也会遇到自己生命中那个唯一的伴侣。
本来想昨天把这篇文章送给大家,但是昨天要出门看望一个生病的朋友,所以就拖到今天啦,希望大家喜欢。
本文目录
一、带音乐字符画和带颜色字符画效果展示
之前看到有人在微博上用一些软件生成了树开花的视频,总想着下次我也要用python实现玩玩。
终于在研究了一段时间后实现了,感谢网上前辈一些资料的提示,大家也可以借由这篇文章的灵感,实现属于你的字符画。
在正式进入代码讲解之前,先来看下本文的实现效果。
1 带颜色字符画效果展示
视频中的字符可以替换成你想替换的名字缩写,我用的是杨紫的首字母缩写。
2 带音乐字符画效果展示
视频中的字符可以替换成你想替换的名字缩写,在开始和结束页可以把你想说的话替换固定字符,也可以是你写的一封信。
二、带颜色字符画生成过程
带颜色字符画的大致生成过程:确定视频——把视频中固定间隔的帧截取出来生成带颜色的字符图片——合并成字符画gif。
若需要从网上下载没有下载按钮的视频,分享大家如下方法。
1 下载要转换成字符的视频
首先在视频播放页面按F12(或者点击页面右上方红框中的三个点,找到更多工具,再点击开发人员工具)。
接着点击带箭头的红框,再点击要下载的视频,右边会自动定位。
然后点击鼠标右键,点击编辑为HTML,即可出现下图中的大红框,再复制小红框src中的链接。
在浏览器中打开,再点击右下角的三个点,即可出现下载按钮。
最后把下载好的视频,存到特点目录即可。
2 把视频中固定间隔的帧截取出来生成图片
把刚刚下载好的视频存放到电脑某个文件夹中,并让下面代码中的路径和存储路径一致即可。
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 把视频中截取的图片转成字符图片
由于视频是在好看视频中下载的,所以图片右上方会带有特定字符。本文对图片进行了截取,处理了那些特殊字符,并把处理好的图片转换成字符图片。
#-*- 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。
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。
三、带音乐字符画生成
带音乐字符画生成过程和带颜色字符画生成过程类似,就不赘述了,有疑问的同学可以到公众号中私信我,本文直接把代码展示如下:
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生成字符画已展示完毕,感兴趣的朋友自己实现一遍吧,可以发挥你的创意生成个性化的表白字符画,给他/她一份独一无二的礼物。
参考文献
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