Python写实用小工具-实现图片转字符画

一、介绍

人物画是一系列人物的组合,我们可以把每个人物看作一个大像素,一个人物可以代表一种颜色,人物种类越多,体现的颜色越多,人物画就越有层次性。

[En]

Character painting is a combination of a series of characters, we can regard each character as a large pixel, a character can represent a color, the more kinds of characters, the more colors can be reflected, the more hierarchical the character painting will be.

灰阶值,表示黑白图像中点的颜色深度,范围为0到255、白色到255和黑色到0。

[En]

The grayscale value, which refers to the depth of the color of the point in the black-and-white image, ranging from 0 to 255, white to 255, and black to 0.

RGB,是红绿蓝三颜色,通过不同的叠加可得到其他颜色。

图片转字符画原理,先定义一个字符集用来和灰度值做映射,将图片每个像素的RGB值转换为一个灰度值,将其对应的字符输出就得到字符画。

RGB转灰度值,有个心理学公式,在网上搜一下我们使用下面这个公式

gray = (2126 * r + 7152 * g + 722 * b) / 10000

二、实现

2.1 准备

1. 我们用到的是Python3,确保有Python3的环境
python3 -V

2. 安装Python图象处理库pillow(PIL)
pip install --upgrade pip
pip install pillow

2.2 代码

ascii.py

#!/usr/bin/python3
#coding: utf-8

from PIL import Image

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
ascii_char = list('MNHQ$OC?7>!:–;. ')

def get_char(r, g, b, alpha=256):
    if alpha == 0:
        return ' '
    # 这是一个优化,将浮点运算转成整型运算
    gray = (2126 * r + 7152 * g + 722 * b) / 10000
    # 为什么是1.0 因为alpha、gray是整型运算的时候按整型算如果小于1的话按0算
    char_idx = int((gray / (alpha + 1.0)) * len(ascii_char))
    return ascii_char[char_idx]

def write_file(out_file_name, content):
    with open(out_file_name, 'w') as f:
        f.write(content)

def main(file_name="test.jpg", width=100, height=80, out_file_name='output.txt'):
    text = ''
    im = Image.open(file_name)
    im = im.resize((width, height), Image.NEAREST)
    for i in range(height):
        for j in range(width):
            text += get_char(*im.getpixel((j, i)))
        text += '\n'
    print(text)
    write_file(out_file_name, text)

if __name__ == '__main__':
    main('dora.png')

2.3 测试

1. 准备图片dora.png
2. 执行命令
python3 ascii.py

Python写实用小工具-实现图片转字符画

               MMH$$$NM
          MQ7777>   $N   OM
        O7777777     C    77OM
      C77777777   >  Q:   $777M
     77777777$>Q     7O$O     Q$
   M?777777N    N   O H .N    >N?>
   777777N   :N:     >QQQQ H
  N77777               MN   .:????

 M77777?  ;:???QQQQ!    H
 H7777H                 !    !HO;
 C7777    QQQQQHNNHNM$> :       O
 C7777    QQQQQQQQQQQQQQQQQQQQQO ?
 $7777    QQQQQQQQQQQQQQQQQQQQ$  M
 M7777    CQHNC?$MHQQQQQQQQQQM  –
  ?777     ?77777777?QQQQQQQ?   M
  M777N     $777777777MQQQH–   ?
   ?777!     .777777777QQH    !
    C777       ?O777777N!    :
     ?77?–       .!QQMMMMMH$M
      O777NNQQQQQ      Q–QCMNM
       NQQNQ7777H      Q;;;; M
        77777777C      O;;;C ?
        777777777O    > H??

        ?777777Q! ;HO:      ;H  MC:N
        H7O$777$ :           ?M      M
        M777777H  ?          N       Q
         ?77777?   :        ;        Q
     QQQMH777777C    .?Q?:  H        M
     QQQM$7777777Q        Q7?

        M77777777777QQ?NO777H       M
        M7777777777777777$MM N    ;
      M N77777777777OM
         C7777777HM
          77777QM
            7QM
      ;
       O
         M$?OM

三、总结

  • 2202/5/24 学习python的基础应用及pillow库的使用

Original: https://www.cnblogs.com/okokabcd/p/16304071.html
Author: okokabcd
Title: Python写实用小工具-实现图片转字符画

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499509/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球