背景
点阵字体,一个很古老的字体了,就是把字体存储在一个二维数组中,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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!