11.26
上网扒了一个程序,简单改动后实现的效果:
参考资料:00-JOHNNY http://blog.csdn.net/u014746368/article/details/50879235
原图:
txt输出:
txt.png
字符格式:
........
+*++.. .+++++++++++.
.++. .*+.
*. .*.
*. . *.
.* .+ + .. .+.
* .+.. + * +*
+* + + + .* *
* . .. .+. ++ .+ *$.. .+
.* + + .+. +. .*+ .+ .$$+. *
+. ++.*$*++. +. .*+ + *+ ...$$+ +*
+..***$$++* .. +.+ . . .$. ..$$$+ *
+ ***$$$$$*.+. ++ $+ . . + *$* .$$*. *+
* +$$$$$$$*+. .+ .$+ .+ . + $$+ .*$+ +
.*.$$$$$$$$. * *$$$ +. * + *$+ .$+ *
.*.$$$$$$$. ++ +$$$$. +. * + $$* ** +
.$+$$$$$. ++ +$$$$$$$ .. $ * +$$$ .+ .*
.**$$$$+ .+ .$$$$$$$$+ .+ $ * .$$$$+ .+ .
$$$$* .+.*$$.$$$$$$$* +++. .$ $ $$$$$$ .. .
$$** +++$$$..+$$$$$$*. .**+$$. .$ $ $$$$$$$+ .. .
.**. *$$$$$. +*$$$$$$$$+$*$++$$$*+$+. .+$+*+ +$$$$$$*+$ .. +
.*+. .$$$$* + +$$$$$$$$*$$$$+*$$$$$$$*..+**+$*$+ *$$$$$$$+*$* .. +.
*++ *$$$+. + .*$$$$$$$$*$$$*+$$$$$$$$$$$$$*+$$$$$$$$$$$$$$$ *$$. .. ++
+++ +$$$$$+ + .+$$$$$$$$$*$$$++$$$$$$$$$$$$$$+$$$$$$$$$$$$$$$ +.$$* .. .*
* .+. *$$.$* + +*$$$$**$$$*$$$++$$$$$$$$$$$$$$*$$$$$$$**$$$$$$+.. $$$. .. +
.++++. $+ ** .+.+..+$$$$$**$$$$$$$+*$$$$$$$$$$$$$$+$$$$$$$*+*$$$$$*.+ *$$* .+ +
.+*. .. .$ ++ .$$$$$++*$$+$$$$*$$$$$$$$$$$$$$$+$$$$$$$$+**$$$$$ . +$$$+. .+ ..
*$$ .+ .*. +. +$$$$*++*$$+$$$$*$$$$$*$$$$$$$$$.$$$$$$$$+.$$$$$$ . *$$ .+ +++
*$$$ .+ $+ ... .*$$$++++*$**$$$$*$$$$$*$$$$$$$$$.$$$$$$$$**+$$$$$... .$$ .*+. +
*$$$. +*.+ +*+ +$$$$+++.*$**$$$$$$$$$$+*$$$$$$$$.$$$$$$$*++**$$$$+.. .$* ++++. **
*$$$$. +++ .$*.* ++$$$+++..*$$*$$$$$$$$$$+*$$$$$$$$.*$$$$$$$.+++*$$$$.. .$* .*$*.+++*+
*$$$$* *++.. +$$... ++$*++++ .*$*+$$$$$$$$$*++$$$$$$$$.+$$$$*$$..+++$$$$$. .$* +$$$. .*$
$$$$$. *+ *+.$$*+* .+$$+++. .*$*.$$$$*$$$$*.+$$$$$$$$+.$$$*++$+ +++*$*$*+. .$* +$ $*..
$$$$$$ .*++**$$$.$+ +*$+++. ...*$$**$$$+$$$$*++*$$$$$$$+ $$$+++$+ .+++*+$$+ .$* . +. +$$+
+$$$$$$+*+ $*$$$**+ .+**++.+...+++ *.*$.*$$$*+.*$$$$$$$* +$$*..$* .+++$+*+ .** + . *$$
*$$$$$$$.*$$$$*.$. ++*+*$$*$$$$$+++. .*+*. +$$$$$$$* .+$*.+*$ +++**++ .** + + $$$.
$$$$*.**$$$$$.$* ++*$$$$$$$$$$$$$$$... .. . .+*+*+*. +++$*+ .** .. ++$$$.
*$$$.+.$$$$$*$$. +++$$ .*$$$$$$$$$$$* .....+ .++ .+++*+ ** + $$$$$.
$$.+*.$$$$$+$$ *+++...*$$*$$$.+* .+* .++$*++..+. .. .+.* *+ *. $$$$$
+*++*+$$$$*$$+ .+*+. +$$$+*$$$$ *$$$$$$$$$+++ ++*. *+ . *+ $$$$+
.++ *.$$$$+*$+ .+$+$+. $+.++++$+ +$$$$$$$$$$$+.+ *+. +. . +* *$*+
+*+++.$$$$*$$ +**+$+ $+....** *$$$$$$$++$$$$+. * +. . .*. *$+
*$$++*$$$*$$* +*++$$+ .** .*$ $$*$*$$$$*. +$+ * + .. .* *+
*$$++$$$$$$$. +$+*$$+ . $$.*+++*$$* +$$$. + .. $ *.
$$*$$$$$$$$$ $$$.$$+ $$..+++.$+ +. *. .+ . $+ +.
$$++$$$*$$$+ +$$$.$$+ .*+...+$* .+* +. . **. *+
$$* $$* *$+ *$$+*$$$* .++. +*$. .+ + +$+ +.
$$* *$. .$ $$$+$$$$* . +*$+ ++ * *$$ *.
$$$*.$ * $$$.$$$$$* .$$.$ .+ $ *$$ *.
*$$$**. . .$$$+$$$$$$+ $$$ * .+ $ $$$.*.
+$$$$$* + +$$$*$$$$$$$$+ $$$$ .* +. .$ $$$+$+
$*$$$$++ $$$$$$$$$$$$$$ ++*$$ * + +$ .$$$+$+
*..+** +$$$$$$$$$$$$$$+ *. *$$ $....$* *$$$*$*
+ + $*$$$$$$$$$$$$$$. *. *$$$. **+..$* .$$.*$$$
*++ +**$$$$$$$$$$$+*$$$ .*$$$$$$$+ .$*+*$* *$ ++.$$
*+$+.$$$$$$$$$$+$$$$** .. .$$$$$$$$$+ $$+$$+ $++++$*$
..$$ .*$$$$$$$$$$$$$$*$$* +$$$$$$$$$$$+ *$$$$. . .++$$**
++$* .$$$$$$**$$$$$$$$$$$ *$$$$$$$$$$$$+ .$$+$ ++++++++
++$$+.$+$$$$$$$$$$$$$$$$$$$$$. ++. $$$+$$$$$$$$* +$$* ++*+++
.*.. .+***$$+$.+*$$$$$$$$$$$$$$$$$$$$+*. .*+ +$$++$$$$$+$* +$$$ +++++
*..*$*++***$$******+**++$$$$$$$$$$$$. $$$. .*$$. $*+*$$$$$.* +$$$*+++
.$*.+. .$*$$*++*$*$$*+..+$* .++++. $$$$$. +$$$$$ $$$$$$$$+*. +$$$*++
.$$. .$$$$. $+*.$$$**$.. +$$*+ .**$$$$$$$+ +*$$$$$$$$+$ .$$$$+$$*. *$$$$.
+$+.$$$$$$ ..*$$$*$+.$$*+$*.++ +++ $$$$$$$$***$$$$$$$$$++..** .$$$*+** .***$*
++*$$$$$$$ +$$$$*. .$$**$*.* *++ .*$$$$$$$$$$$$$$$$$.++ + + .*****. .$**$$$$+.
.+*$$$$$$$$ .+$$$+**+.*+*$$+ *..+. .$$$$$$$$$$$$$$$$*++.*.+ ..* +$*+.+*$. +$*.++$$$*+
.*+$$$$$+$$$ .++*$$.$+ .*$*$* .+.. .++.$$$$$$$$$$$$$$*.+++++.+....+ +$*++*$*. **+*$+*$$$$*
$*$$$$$$*+.+ *....++ +$. **$$ .*++ .. .*$$$$$$$$$$$$*+++++++++..+*+++ *++$$.*. *$+*++$+$$$$.
$$$$$$* + .$$++++$$+ .++$*+..*+.. ...$$$$$$$$$*++++++++++**.++ +.+ .++$$*+ .**.$$$$$+$$$$+
.*$$$$*+ ..+ $$$.+ .....++$. $*.+ .. .*$$$**++++++++++++.*+*..+ .+* +$$$*++ +*.$+*$$$$+*$$$
.$$$$$+ +.$+$$$.+ .$$ *$*+ .. ....+++++++++++++++++. + + ++. $$$$**.. *$$$+$$$$$$*$$
.$$$$$* .+.$*$$$+ .$$* *$$$. ++ .. .+++++++++++++++. .. .+ .**+ +$$$$$$+ *$$**$*$$$$$*$$
$*$$$. .+*$$$$*+++$$$**.$$$$++ +. +++*++++++++++. .+ + +. *. ..*$$$$$ +$$$**$++$$$$$$*$
+*$$$.. +.*$$$$.+$$$$***$$$$*. . .++++*+++++++*+. .+ + ++*. ..*. +$$$.++*$$$$*$$$**.
$$$+.+ +. .+*$$$$**.+*$+$$$*$$ . *++++++* +++++* . +. $$. ++ +$$$* .$$$$$$+
+$$$+.+ + .+$$$$$++.$*+$$$ $$ .+ ++++++*+* +++++++*. + .+*$$. + +$$$+ +$$$$+
$$$$..+ .+ ++$$$$*$$.$$$. .*+ .+++++**++++.*+**++++*. .+ $$$$+ +. +$$$$+ *$$+
$$$$ .+ .+ .+*$$$$**+$$*. +. +++++*.++++*+*++++++++* .+.*$+$$*+ +$$$$+. $*+
$$$* ++ .. .*$$$$**$$+ .. .+++++*+*+++++**+++.*++++++ +* *+ +$$$$$++ .++
$$$* .* . **$$$$$$$+ +++++++$$$*+*+++++*++++*++++++.+* .+ +$$$$$*+ +*
要求图片是正方形,否则效果不太好。
代码:
# http://blog.csdn.net/u014746368/article/details/50879235
from PIL import Image
from sys import argv
import os
PATH = os.getcwd()+'\\'
imgname = argv[1]
IMG = PATH + imgname # 获得图片文件的路径+文件名
WIDTH = 120
HEIGHT = 80
OUTPUT = os.getcwd()+'\\'+ imgname.split('.')[0]+'.txt' # 获得输出txt文件的路径+文件名
ascii_char = list("$*+. ") # 字符画的深浅表
def get_char(r,b,g,alpha = 256):
if alpha == 0:
return ' '
length = len(ascii_char)
gray = int(0.2126*r+0.7152*g+0.0722*b) # 将RDB值转换成灰度
unit = (256.0+1)/length
return ascii_char[int(gray/unit)] # 将灰度等比例转换成字符
if __name__ == '__main__': # 主函数
im = Image.open(IMG)
im = im.resize((WIDTH,HEIGHT),Image.NEAREST) # 重新设置图片大小,把分辨率定为最低,避免生成的txt太大
txt = ""
for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j,i))) # 调用子函数,转换一个字符
txt += '\n'
print txt # 输出到屏幕
with open(OUTPUT,'w') as f: # 输出到文件
f.write(txt)
f.close()
——————————————————————————————————————
11.27更新
在字符画的基础上,可以生成字符联播,像小视频一样。这里的参考资料是:殷缘星 https://www.cnblogs.com/kirito-c/p/5971988.html
我分了好几个程序实现:
- 先用Mp42Png.py实现视频分解成图片,
- 再用zifuhua.py生成文本文件,
- 最后用player.py播放出来。
最后一步与参考资料不同,采用了python的界面工具Tkinter,但不知为什么,定时器设置为21ms刷新一张图片就太慢了,而20ms刷新一次就太快了,很迷,所以也没有加入音乐,目前只是一个半成品。
代码如下:
# Mp42Png.py
# https://www.cnblogs.com/kirito-c/p/5971988.html
# 分解视频的程序,直接copy了参考资料里的
# 此程序有个bug,视频逐帧分解完了之后还在运行,除非ctrl+C
import numpy as np
import cv2
import os
cap = cv2.VideoCapture('argv[1]')
num = 0
while (cap.isOpened()):
print('pic',num)
ret, frame = cap.read()
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imwrite(os.getcwd()+'\\pictures\\img%d.png' % num, frame)
num += 1
print('finish')
# zifuhua.py
# 字符画生成的程序,每帧生成一个文本文件,存放在 当前目录\text\文件夹中
from PIL import Image
from sys import argv
import os
IMGPATH = os.getcwd()+'\\pictures\\'
WIDTH = 160
HEIGHT = 60
# OUTPUT = os.getcwd()+'\\zifuhua.txt'
IMGNUM = sum([len(x) for _, _, x in os.walk(os.path.dirname(IMGPATH+'img0.png'))]) # 得到\picture\目录中有多少文件
TXTPATH = os.getcwd()+'\\text\\'
ascii_char = list("$*+. ")
def get_char(r,b,g,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)]
if __name__ == '__main__':
x = 0
while x< IMGNUM:
f = open(TXTPATH+'txt'+str(x)+'.txt','w')
im = Image.open(IMGPATH+'img'+str(x)+'.png')
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('finish %d',x)
f.write(txt)
x = x+1
f.close()
# 看播放效果
# 思路是在界面上放一个文本框,用合适的频率不断刷新这个文本框
# 遗憾的是我并没有找到合适的频率
from sys import argv
import os
import time
import Tkinter
TXTPATH = os.getcwd()+'\\text\\' # 文本文件位置
IMGNUM = sum([len(x) for _, _, x in os.walk(os.path.dirname(TXTPATH+'img0.png'))]) # 需要播放的帧总数
FRAMETIME = 20 # 20ms播放一帧
window = Tkinter.Tk() # 放置窗体
window.title('Bad Apple Player') # 修改窗体标题
window.geometry('1000x850') # 修改窗体大小
txtpage = ""
player = Tkinter.Label(window,text = txtpage,width=800,height=600,font=('Consolas',8),justify="left") # 设置文本框初始值
player.pack() # 放置文本框
x = 1 # x表示当前帧数
# 定时器处理函数
def trickit():
global x
global time1
txtpage = ""
f = open(TXTPATH+'txt'+str(x)+'.txt','r')
for line in f:
txtpage = txtpage + line
player.config(text = txtpage)
window.update()
f.close()
x += 1
if x <= IMGNUM:
player.after(FRAMETIME, trickit)
player.after(0, trickit) # 激活定时器
window.mainloop()
代码在此处:https://github.com/cr19941016/BadApple_PythonTest
这是生成的效果,生成gif的软件是ScreenToGif 2,又小又轻便,大赞!
网友评论