{不借助任何软件或程序开发平台} 实现文本艺术化处理 · 借助Powershell实现字符大小有序排列并生成图片 +【博客搬家】恰逢1024全球程序员节2018.10.24 --- 从CSDN到博客园
恰逢1024全球程序员节2018.10.24,决定从商业化严重、广告满天飞的CSDN中走出来,去一个安静舒适的新环境---博客园。其实早在两年前就有园子的号了,但是当时在两个博客站间犹豫之中,还是比较看好CSDN的商业性,推广性,因此就选择了它。现在,决定入园,喜欢安安静静的,把自己的知识传播出来。
*PS -------- {不借助任何软件或程序开发平台} 做数字媒体处理或开发一向是我的理想。2025年,我要重新编辑这篇随笔,做一个例子,鼓励我自己 ------
实现文本艺术化处理 · 借助Powershell实现字符大小有序排列并生成图片
【材料】 给一串字符串 : "希望是个好东西,也许是世间最美好的,美好的东西从不会逝去。"
【要求】 不借助任何软件或开发平台,仅靠windows系统。做一个艺术化处理并生成新的图片:字符串打印在画布上,但是每个字符大小不一致,越是靠画布中间越大,越远离画布越小。
【思路】 不能使用软件或其他平台,使用windows原生环境,可以借Powershell调用.net framework来做开发。调用程序集System.Drawing,做图像处理,绘制字符。然后每个字符的大小需要计算得出。
参考公式:字体大小 = 最大字体 - (距离/中心距离) × (最大字体-最小字体),确保中间字符最大,边缘字符最小。
【设计】 接下来先给出脚本代码
Add-Type -AssemblyName System.Drawing
# 定义参数
$text = "希望是个好东西,也许是世间最美好的,美好的东西从不会逝去。"
$canvasWidth = 65 * $text.Length #通过字符数量定义画幅宽度
$canvasHeight = 600
$centerX = $canvasWidth / 2
$maxFontSize = 48
$minFontSize = 12
# 创建画布
$image = New-Object System.Drawing.Bitmap($canvasWidth, $canvasHeight)
$graphics = [System.Drawing.Graphics]::FromImage($image)
$graphics.Clear("White")
# 计算字符位置与大小
$charWidth = $canvasWidth / $text.Length
$baseY = $canvasHeight / 2 # 垂直居中
for ($i=0; $i -lt $text.Length; $i++) {
$char = $text[$i].ToString()
$x = $i * $charWidth + ($charWidth/2)
$distance = [Math]::Abs($x - $centerX)
$fontSize = $maxFontSize - ($distance/$centerX)*($maxFontSize-$minFontSize)
$font = New-Object System.Drawing.Font("Microsoft YaHei", $fontSize)
$size = $graphics.MeasureString($char, $font)
$posX = $x - $size.Width/2
$posY = $baseY - $size.Height/2
$graphics.DrawString($char, $font, [System.Drawing.Brushes]::Black, $posX, $posY)
$font.Dispose()
}
# 保存图片
$image.Save(".\ArtText.png")
$graphics.Dispose()
$image.Dispose()
其中:
$maxFontSize = 48 用来定义字符最大的数值
$minFontSize = 12 用来定义字符最小的数值
$x = $i * $charWidth + ($charWidth/2)
计算当前字符的水平中心坐标。
$distance = [Math]::Abs($x - $centerX)
计算当前字符中心点距离画布中心点的水平距离。
$fontSize = $maxFontSize - ($distance/$centerX)*($maxFontSize-$minFontSize)
根据距离动态计算字体大小,实现从中心到边缘的渐变缩放。
$font = New-Object System.Drawing.Font("Microsoft YaHei", $fontSize)
创建当前字符的字体对象。
$size = $graphics.MeasureString($char, $font)
计算当前字符的实际渲染尺寸。
$posX = $x - $size.Width/2
微调字符的水平绘制位置,实现精确居中。
$posY = $baseY - $size.Height/2
微调字符的垂直绘制位置,实现垂直居中。
$graphics.DrawString($char, $font, [System.Drawing.Brushes]::Black, $posX, $posY)
将字符绘制到画布指定位置。
$font.Dispose()
释放字体对象占用的系统资源。
【测试】
将代码保存为ArtText.ps1
,右键选择“用PowerShell运行”。
首次运行一般要允许脚本执行权限(最好在管理员模式下执行Set-ExecutionPolicy RemoteSigned
)
给出参考结果:
编写于2025.2.25
CSDN 原地址:
https://blog.csdn.net/fddxsyf123
博客园 新地址:
https://www.cnblogs.com/sharpeye
github 地址:
https://github.com/ShenyfZero9211
个人网站:
作品展示:
谢谢支持!欢迎各位大神指点!