美文网首页
Python字符画小练习

Python字符画小练习

作者: 十月石榴2013 | 来源:发表于2017-11-26 14:12 被阅读128次

11.26
上网扒了一个程序,简单改动后实现的效果:
参考资料:00-JOHNNY http://blog.csdn.net/u014746368/article/details/50879235
原图:

1.jpg
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

image.png
我分了好几个程序实现:
  1. 先用Mp42Png.py实现视频分解成图片,
  2. 再用zifuhua.py生成文本文件,
  3. 最后用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,又小又轻便,大赞!

Animation.gif

相关文章

网友评论

      本文标题:Python字符画小练习

      本文链接:https://www.haomeiwen.com/subject/zxmkbxtx.html