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

