PowerShell 技能连载 - 创建 ASCII 艺术

PowerShell 的功能令人惊叹:只需要几行代码,就可以将任意照片和图片转化为一段 ASCII 艺术。PowerShell 只需要加载图片,然后然后逐行逐列扫描它,然后基于每个像素的亮度将每个像素替换为一个 ASCII 字符。

以下是该函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 function Convert-ImageToAsciiArt
{
param(
[Parameter(Mandatory)][String]
$Path,

[ValidateRange(20,20000)]
[int]$MaxWidth=80,

# character height:width ratio
[float]$ratio = 1.5
)

# load drawing functionality
Add-Type -AssemblyName System.Drawing

# characters from dark to light
$characters = '$#H&@*+;:-,. '.ToCharArray()
$c = $characters.count

# load image and get image size
$image = [Drawing.Image]::FromFile($path)
[int]$maxheight = $image.Height / ($image.Width / $maxwidth)/ $ratio

# paint image on a bitmap with the desired size
$bitmap = new-object Drawing.Bitmap($image,$maxwidth,$maxheight)


# use a string builder to store the characters
[System.Text.StringBuilder]$sb = ""

# take each pixel line...
for ([int]$y=0; $y -lt $bitmap.Height; $y++){
# take each pixel column...
for ([int]$x=0; $x -lt $bitmap.Width; $x++){
# examine pixel
$color = $bitmap.GetPixel($x,$y)
$brightness = $color.GetBrightness()
# choose the character that best matches the
# pixel brightness
[int]$offset = [Math]::Floor($brightness*$c)
$ch = $characters[$offset]
if (-not $ch){ $ch = $characters[-1] }
# add character to line
$null = $sb.Append($ch)
}
# add a new line
$null = $sb.AppendLine()
}

# clean up and return string
$image.Dispose()
$sb.ToString()
}

以下是它的使用方法:

1
2
3
4
5
6
7
8
$Path = "C:\Users\Tobias\Desktop\Somepic.jpg"
$OutPath = "$env:temp\asciiart.txt"

Convert-ImageToAsciiArt -Path $Path -MaxWidth 150 |
Set-Content -Path $OutPath -Encoding UTF8


Invoke-Item -Path $OutPath

请确保调整了代码中的路径。将会在缺省的文本编辑器中打开 ASCII 艺术。请确保禁用了换行,选择一个等宽的字体和一个足够小的字号!

                       ;@&&&&&&@&&&&@+-
                     :@&&&&&&&&&&&&&&&&&&:.
                   ,&&&&&&&&&&&&&&&&&&&&&&&&&&*
                -@&&&&&&&&&&&HHHHHH&&&&&&&&&&&&&*
             :&&&&&&&&&&&&H&&&&&&&&&&&&&&&&&&&&&&&@
            *&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,
           :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&-
          *&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*
         &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
        @&&&&&&&&H&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&-
       &&&&&&&&H&&&@;:+&&&&&&&*-....,:@&&&&&&&&&&&&&&&&&&&@
      &&&&&&&&H&&;........................*&&&&&&&H&&&&&&&&&.
    .&&&&&&&&&H;...........................&&&&&&&&H&&&&&&&&&-
   ;&&&&&&&&&&:............................@@&&&&&&H&&&&&&&&&&
  &&&&&&&&&&&.+...........................-.;&&&H&&H&&&&&&&&&&@
 *&H&&&&&&&&;;..............................+@+&&HH&&&&&&&&&&&&
 ;&H&&&&&&&&................................@*.&&&H&&&&&&&&&&&&:
 :&H&&&&&&&*...............................:*..&H&&&&&&&&&&&&&&@
 ,&&H&&&@&@...................................,&&&&&&&&&&&&&&&&&,
 ,&&&&&&:+....................................+*.;:&&&&&&&&&&&&&&
 +&&&&&&............................................@*@+&&&&&&&&&,
 &&&&&&;............................................,-..-+&&&&&&&
:&&&&&@-...................................................:&&&&&,
&&&&&&&.....................................................&&&&&-
&&&&&&+.....................................................&&&&&,,
:&&&&&;.....................................................&&&H&
 &&&&&;.......................................,.,...........&&&&H&@
*-&&&&:...*&&&&&&&&&&&&&@*,.............-*&&&&&&&&&&&&:.....@&&&&+
  &&&&:.+&&HHHHHHHHHHHHH&&&&..........+&&&&HHHHHHHHHHHHH*...+&&&&@
 ,###H*+;;:,...........-;*&&##########&&&*:..........:;*@:;*&###H:
 :##H*.......................#@;---+#;.......................@###.
,@###+............+HH&+.....-&......-*......;&H&*............&##:.
 ,&&#-...........HHH&+H;....@;......,#.....@HHH;H@...........HH&-.
 ..;#,...........HHHHHH+....#........H,....&HHHHH&..........-#&:-
 ...H*...........-;;;;;....-H........;@....,;;;;;,..........;#&..
 ...&#.....................#-.........#.....................&H*..
 ...:H&........,.........-#@..........-#;..........,,......:#&,..
  ...-,&###&+::-,,::+&###+......  ......-###H*:::,,::+@####,....
  ..........,,,,,,,,...........   ............,,,,,,,,..........
   ............................   ..............................
   ............................   .............................
    .....................,.....   ............................
     ....................,.....   .......,...................
       ..................,,,...   .......,.................
        ......................,.  ..,......................
        ........................,,,.......................
        ..................................................
         .................................................
         .............,-..................--.............
          ...............--,,-----:-,. --...............
           ..................,,----,,...................
            ...........................................
             .........................................
              ......................................
               ....................................
                 ................................
                  ..............................
                   .,,,,,,,,,,,,,,,,,,,,,,,,,,
                 ,&...,,,,,,,,,,,,,,,,,,,,,,...@,
              &HHH......,,,,,,,,,,,,,,,,,,.....-HHH&
          :HHHHHHH&.........,,,,,,,,,,,........HHHHHHHH;
       *HHHHHHHHHHHH+........................*HHHHHHHHHHHH@
    -HHHHHHHHHHHHHHHHH&;..................;&HHHHHHHHHHHHHHHHH,
   HHHHHHHHHHHHHHHHHHHHHHHH&*;:---::;*&HHHHHHHHHHHHHHHHHHHHHHH&
  HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

这儿有一个很酷的优化技巧:在 Convert-ImageToAsciiArt 函数中,请注意 $characters。它是一个包含 ASCII 艺术中使用的字符的字符串,而这些字符是按亮度降序排列的。对于黑白作品,可以使用:

1
$characters = [char]0x2588, ' '
评论