我正在制作一个工具,该工具可以自动裁剪和定位,而无需将图像调整为另一个图像。 我在.NET的Microsoft文档中找到了this,但是我不明白如何在我的代码中实现。 我到目前为止所得到的:
使用此脚本:
$Username="Bernd_L"
$Uuid=$(ConvertFrom-JSON -InputObject ($(Invoke-webrequest -URI "https://api.mojang.com/users/profiles/minecraft/$($Username)").Content)).id
$Base64Skin=(Invoke-webrequest -URI $(ConvertFrom-JSON -InputObject ($([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($($(ConvertFrom-JSON -InputObject ($(Invoke-webrequest -URI "https://sessionserver.mojang.com/session/minecraft/profile/$($Uuid)").Content)).properties.value)))))).textures.skin.url).Content
[IO.File]::WriteAllBytes("$pwd\$Username.png", $Base64Skin)
我想知道是否可以在坐标为8,0 处裁剪8x8像素的矩形并将其粘贴到坐标为8,8的Steve.png顶部,因此最终输出将如下所示:
我应该如何在Powershell中本地使用.Net?另外,在Powershell脚本中找到System.Drawing示例的好地方吗?
编辑
感谢@Caramiriel提供的链接。现在,我可以使用以下脚本完全裁剪图像:
Add-Type -AssemblyName System.Drawing
$Username="Bernd_L"
$Uuid=$(ConvertFrom-JSON -InputObject ($(Invoke-webrequest -URI "https://api.mojang.com/users/profiles/minecraft/$($Username)").Content)).id
$Base64Skin=(Invoke-webrequest -URI $(ConvertFrom-JSON -InputObject ($([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($($(ConvertFrom-JSON -InputObject ($(Invoke-webrequest -URI "https://sessionserver.mojang.com/session/minecraft/profile/$($Uuid)").Content)).properties.value)))))).textures.skin.url).Content
[IO.File]::WriteAllBytes("$pwd\$Username.png", $Base64Skin)
$destRect = new-object Drawing.Rectangle 8, 0, 8, 8
$srcRect = new-object Drawing.Rectangle 0, 8, 8, 8
$src=[System.Drawing.Image]::FromFile("$pwd\$Username.png")
$bmp=new-object System.Drawing.Bitmap 64,64
$graphics=[System.Drawing.Graphics]::FromImage($bmp)
$units = [System.Drawing.GraphicsUnit]::Pixel
$graphics.DrawImage($src, $destRect, $srcRect, $units)
$graphics.Dispose()
$bmp.Save("$pwd\output.png")
如果有一种更紧凑/优雅的方法,我真的很想知道!
答案 0 :(得分:1)
根据@Mathias R. Jessen的建议,我使用了一个函数,因此它看起来更优雅: 添加类型-AssemblyName System.Drawing
$Username="Steve"
$Uuid=$(ConvertFrom-JSON -InputObject ($(Invoke-webrequest -URI "https://api.mojang.com/users/profiles/minecraft/$($Username)").Content)).id
$Base64Skin=(Invoke-webrequest -URI $(ConvertFrom-JSON -InputObject ($([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($($(ConvertFrom-JSON -InputObject ($(Invoke-webrequest -URI "https://sessionserver.mojang.com/session/minecraft/profile/$($Uuid)").Content)).properties.value)))))).textures.skin.url).Content
[IO.File]::WriteAllBytes("$pwd\$Username.png", $Base64Skin)
$bmp=new-object System.Drawing.Bitmap 64,64
$graphics=[System.Drawing.Graphics]::FromImage($bmp)
$src=[System.Drawing.Image]::FromFile("$pwd\$Username.png")
$units = [System.Drawing.GraphicsUnit]::Pixel
function DrawCroppedImage {
param( [int]$srcX, [int]$srcY, [int]$srcWidth, [int]$srcHeight, [int]$destX, [int]$destY, [int]$destWidth, [int]$destHeight )
$destRect = new-object Drawing.Rectangle $destX, $destY, $destWidth, $destHeight
$srcRect = new-object Drawing.Rectangle $srcX, $srcY, $srcWidth, $srcHeight
$graphics.DrawImage($src, $destRect, $srcRect, $units)
}
DrawCroppedImage 8 0 8 8 8 0 8 8
$graphics.Dispose()
$bmp.Save("$pwd\1.png")
因此,我可以重复一次,而无需为每个农作物再次重写所有代码。我想补充一个事实,如果您缩放它(最后两个整数= 16),但是您想在没有任何插值的情况下使用它,则可以使用相同的函数,但要多加两行:
function DrawCroppedImage {
param( [int]$SrcX, [int]$SrcY, [int]$SrcWidth, [int]$SrcHeight, [int]$DestX, [int]$DestY, [int]$DestWidth, [int]$DestHeight )
$DestRect = new-object Drawing.Rectangle $DestX, $DestY, $DestWidth, $DestHeight
$SrcRect = new-object Drawing.Rectangle $SrcX, $SrcY, $SrcWidth, $SrcHeight
$graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::NearestNeighbor
$graphics.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::Half
$graphics.DrawImage($Src, $DestRect, $SrcRect, $Units)
$graphics.Dispose()
}
通过this thread找到