Python字符画小练习

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,482评论 6 427
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,138评论 25 707
  • 1.基本术语 也许你听说过并发和并行操作。并发是程序的属性,而并行运作是机器的属性。并行和并发是两种分开的概念。作...
    crosstrack阅读 281评论 0 0
  • 有些再见说见就见,有些再见却永远不能再见! “我快死了,我没有力气了”。 你一动不动的躺在地上,没有了头发,左边被...
    茶小幂阅读 1,344评论 0 3
  • 连续233 【传8:17】我就看明神一切的作为,知道人查不出日光之下所作的事;任凭他费多少力寻查,都查不出来,就是...
    报佳音阅读 329评论 0 0