本文目录
背景
之前转载过一篇文章Powershell将bmp文件转换成ico文件,codecook回复到能否在图片上写一段文字。我进而联想到给图片添加文字水印。为了不影响图片整体的效果,一般图片的水印文字位于四个边角。今天借着圣诞节的气氛,顺便给所有PowerShell爱好者送下节日的祝福,哈哈!
需求
- 函数名命名为:Draw-WatemarkString
- 水印文字支持东南,西南,西北,东北,四个位置
- 函数支持的参数包括图片文件,水印文字,位置,字体大小,字体颜色,字体名称,边缘宽度,字体风格(加粗,倾斜,下划线等)
- 图片文件路径和水印文字为强制参数,其它均为可选参数
知识点
- 调用c# System.Drawing命名空间下的Graphics.DrawString(string,font,brush,pointF)
- System.Drawing.Image对象不能再原有的路径上保存,可以先保存到临时文件,然后替换原文件
- 枚举值之间的或可以使用-bxor操作符
- FontStyle变量必须声明为强类型,否则执行或操作后,变为整数,在初始化Font时失败
- 使用[Parameter(Mandatory=$true)]限制参数为强制参数
- 使用[ValidateNotNullOrEmpty()]限制参数如果指定,则不能为空或白空格
- 使用[ValidateSet(obj1,obj2,objn)]限制参数的取值集合
- 使用[ValidateRange(m,)]限制参数的取值区间
- 使用[ValidatePattern($pattern)限制参数必须匹配指定模式(正则表达式)
脚本
<#
.Synopsis
draw watemark string on a picture file.
.DESCRIPTION
draw watemark string on a picture file
.EXAMPLE
Draw-WatemarkString -ImageFile 'D:\Merry Christmas.jpg' -Text 'Merry Christmas' -Location NorthWest -FontSize 35 -Color Red
.EXAMPLE
#>
function Draw-WatemarkString()
{
param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[ValidatePattern("(.jpg)|(.png)|(.gif)$")]
[io.fileinfo]$ImageFile,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]$Text,
[ValidateSet("NorthWest", "NorthEast", "SouthWest","SouthEast")]
[string]$Location='SouthEast',
[System.Drawing.Color]$Color=[System.Drawing.Color]::Blue,
[ValidateRange(1,[system.single]::MaxValue)]
[float]$FontSize = 10,
[string]$FontFamily='Microsoft YaHei',
[ValidateRange(0,[system.single]::MaxValue)]
[int]$margin = 2,
[switch]$Bold,
[Switch]$Italic,
[switch]$Underline,
[switch]$Strikeout
)
# test image file exists
if( -not (Test-Path $ImageFile) )
{
throw "Image file $ImageFile not exists. "
}
# font style
[drawing.fontstyle]$fontStyle= [drawing.fontstyle]::Regular
(
($Bold,[drawing.fontstyle]::Bold),
($Italic,[drawing.fontstyle]::Italic),
($Underline,[drawing.fontstyle]::Underline),
($Strikeout,[drawing.fontstyle]::Strikeout)
) | foreach {
if($_[0])
{
$fontStyle = $fontStyle -bxor $_[1]
}
}
# graphics and brush
$font = New-Object System.Drawing.Font($FontFamily, $FontSize,$fontStyle)
$img = [drawing.image]::FromFile($ImageFile)
$drawBrush = [drawing.solidbrush]$Color
$g = [drawing.graphics]::FromImage($img)
$textSize = $g.MeasureString($Text,$font).ToPointF()
$pointF = New-Object System.Drawing.PointF
# location
switch ($Location)
{
'NorthWest'
{
$pointF.X = $margin
$pointF.Y = $margin
}
'NorthEast'
{
$pointF.X = $img.Width - $margin - $textSize.X
$pointF.Y = $margin
}
'SouthWest'
{
$pointF.X = $margin
$pointF.Y = $img.Height - $margin - $textSize.Y
}
'SouthEast'
{
$pointF.X = $img.Width - $margin - $textSize.X
$pointF.Y = $img.Height - $margin - $textSize.Y
}
}
# draw string and save image to temporary file
$g.DrawString($Text,$font,$drawBrush,$pointF)
$tempImage = '{0}.tempImage' -f $ImageFile
$img.Save($tempImage)
# dispose graphics, brush, image
$g.Dispose()
$drawBrush.Dispose()
$img.Dispose()
# copy temporary file to original source
Copy-Item $tempImage $ImageFile -Force
Remove-Item $tempImage
}
示例和截图
示例
Draw-WatemarkString -ImageFile 'D:\Merry Christmas.jpg' -Text '祝广大PowerShell群友们:' -Location NorthWest -FontSize 35 -Color Red Draw-WatemarkString -ImageFile 'D:\Merry Christmas.jpg' -Text '圣诞节快乐!' -Location NorthEast -FontSize 90 -Color Red -Bold -margin 60 Draw-WatemarkString -ImageFile 'D:\Merry Christmas.jpg' -Text 'PowerShell 中文博客:https://www.pstips.net' -Location SouthWest -FontSize 30 -Italic -Underline Draw-WatemarkString -ImageFile 'D:\Merry Christmas.jpg' -Text '2013年12月25日' -Location SouthEast -FontSize 30 -Italic
截图
点击放大查看添加水印后的效果
本文链接: https://www.pstips.net/draw-watemark-string.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!


非常感谢,测试时有错误。
参数属性必须是常量或脚本块。
位于 :行:6 字符:46
+ [ValidatePattern(“(.jpg)|(.png)|(.gif)$” ) <<<< ]
你使用的是PowerShell 4.0吗?
如果不是,你把那些参数的限制条件全部去掉,再运行试试。
不是4.0.那在2.0怎么设置参数呢?想学习下。
param( [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][ValidatePattern("(·.jpg)|(·.png)|(·.gif)$")][io.fileinfo]$ImageFile, [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$Text, [ValidateSet("NorthWest", "NorthEast", "SouthWest","SouthEast")] [string]$Location='SouthEast', [System.Drawing.Color]$Color=[System.Drawing.Color]::Blue, [ValidateRange(1,[system.single]::MaxValue)] [float]$FontSize = 10, [string]$FontFamily='Microsoft YaHei', [ValidateRange(0,[system.single]::MaxValue)] [int]$margin = 2, [switch]$Bold, [Switch]$Italic, [switch]$Underline, [switch]$Strikeout )关于PowerShell2.0中早期支持的参数,可以参考
去掉那些限定类型,脚本能成功了。
param( [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][ValidatePattern("(·.jpg)|(·.png)|(·.gif)$")][io.fileinfo]$ImageFile, [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$Text, [ValidateSet("NorthWest", "NorthEast", "SouthWest","SouthEast")] [string]$Location='SouthEast', [System.Drawing.Color]$Color=[System.Drawing.Color]::Blue, [ValidateRange(1,[system.single]::MaxValue)] [float]$FontSize = 10, [string]$FontFamily='Microsoft YaHei', [ValidateRange(0,[system.single]::MaxValue)] [int]$margin = 2, [switch]$Bold, [Switch]$Italic, [switch]$Underline, [switch]$Strikeout )这里很多功能不太会用。。。脚本不会插,估计图片也不能上传吧?
[switch]类型 在这里是的用途是什么?
谢谢
@codecook
关于[switch],是一个参数。如果你指定了-yourswitch ,值就是true,否则就是false
关于图片,评论不支持图片上传。
关于评论中插入代码,可以使用
<pre class=”brush:powershell”>
Get-Command
</pre>
使用后效果
我把你的回复稍微更新了下,谢谢!
请问视频能够加水印吗?
好厉害,但是如何添加竖排的文字水印?????