点阵字体

PowerShell在控制台打印点阵字体


背景

点阵字体,一个很古老的字体了,就是把字体存储在一个二维数组中,16×16,32×32,64×64等。每一个点代表一个像素点的值。但是点阵字体有一个致命的缺点,在放大后容易出现锯齿,失真。所以现在主流的字体用矢量字体,据说矢量字体可以尽量规避这一情况。
点阵字体现在多见于一些电子显示屏上,今天让我们用Powershell控制台来缅怀这即将退出历史舞台的点阵字体。

思路

将字体画在一张图片上,白纸黑字,也就只有两种颜色了,然后将图片上的每个像素点,黑色为1,白色为0,返回为二维数组。最后将二维矩阵打印在控制台上,值为1带引#号,值为0打印空格。

实现

##
## 获取一个字符的二维点阵数组
##
Function Get-LatticeArray
{
    param(
    [char]$char='x'
    )

    ## 定义字体
    $fontStyle= [drawing.fontstyle]::Regular
    [string]$fontFamily='Microsoft YaHei'
    [int]$fontSize=26
    $font = New-Object 'System.Drawing.Font' $fontFamily,$fontSize,$fontStyle

    ## 定义画布
    $size=40
    $bitmap= New-Object System.Drawing.Bitmap $size,$size
    $g = [System.Drawing.Graphics]::FromImage($bitmap)

    ## 定义笔刷,每一种字体渲染点的起始坐标可能不一样,请自行调整,
    ## 我这里设置成-3,是为了不浪费画布开头的间隙空白。
    $drawBrush =  [System.Drawing.SolidBrush]([System.Drawing.Color]::Black)
    $pointF = New-Object System.Drawing.PointF -3,-4

    ## 将字符画在内存中。
    $g.DrawString($char.ToString(),$font,$drawBrush,$pointF)
    $g.Flush()
    $g.Dispose()

    ## 在调试字体大小和画布大小时,
    ## 可以将图片输出文件自行预览
    #$bitmap.Save("d:\test.bmp")

    $array = New-Object 'int[,]' $size,$size
    for($i=0;$i -lt $bitmap.Width;$i++)
    {
        for($j=0;$j -lt $bitmap.Height;$j++)
        {
            $c= $bitmap.GetPixel($j,$i)
            if($c.Name -eq '0'){
                $array[$j,$i]=0
            }
            else{ 
                $array[$j,$i]=1
            }
        }
    }
    
    $bitmap.Dispose()
    ,$array
}

##
## 在控制台中以点阵字体打印字符串
##
function Print-LatticeChar([string]$char)
{
    $left =[console]::CursorLeft
    $top = [console]::CursorTop 
    foreach($ch in $char.ToCharArray())
    {
        $arr=Get-LatticeArray -char $ch
        $charWidth = $arr.GetLength(0)
        for($i=0;$i -lt  $charWidth;$i++)
        {
            for($j=0;$j -lt  $charWidth;$j++)
            {
                if($arr[$j,$i] -eq 1)
                {
                    [console]::Write('#')
                }
                else
                { 
                    [console]::Write(' ')
                }
            }

            $left = [console]::CursorLeft - $charWidth
            if ( $left -le 0 )
            {
                $left = 1
            }
           [console]::CursorLeft = $left
           [console]::CursorTop ++
         }
         if( ([console]::CursorLeft + $charWidth) -gt $Host.UI.RawUI.BufferSize.Width)
         {
            [console]::CursorTop += $charWidth
         }
         else
         { 
            [console]::CursorLeft += $charWidth
            [console]::CursorTop  -= $charWidth
         }
    } 
}

Add-Type -AssemblyName System.Drawing
Print-LatticeChar -char '朱门酒肉臭'

效果

点阵字体

点阵字体

本文链接: https://www.pstips.net/get-latticearray.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注