Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell在System.Drawing中使用.NET.DrawImage_.net_Powershell_System.drawing - Fatal编程技术网

Powershell在System.Drawing中使用.NET.DrawImage

Powershell在System.Drawing中使用.NET.DrawImage,.net,powershell,system.drawing,.net,Powershell,System.drawing,我正在制作一个工具,可以自动裁剪和定位,并将一个图像调整为另一个图像。 我在microsoft docs for.NET上找到了,但我无法理解如何在代码中实现。到目前为止,我可以从Mojang API下载图像,如: 伯尔尼首都巴布亚新几内亚 Steve.png 我想知道是否可以在坐标8,0处裁剪一个8x8像素的矩形,并将其粘贴到坐标8,8处的Steve.png上,因此在最后输出将如下所示: output.png 如何使用.NET函数.DrawImage实现裁剪 编辑 感谢@Caramiri

我正在制作一个工具,可以自动裁剪和定位,并将一个图像调整为另一个图像。 我在microsoft docs for.NET上找到了,但我无法理解如何在代码中实现。到目前为止,我可以从Mojang API下载图像,如:

伯尔尼首都巴布亚新几内亚

Steve.png

我想知道是否可以在坐标8,0处裁剪一个8x8像素的矩形,并将其粘贴到坐标8,8处的Steve.png上,因此在最后输出将如下所示:

output.png

如何使用.NET函数
.DrawImage
实现裁剪

编辑 感谢@Caramiriel提供的链接,我终于可以使用此脚本裁剪图像的一个区域:

Add-Type -AssemblyName System.Drawing

$Username = "Steve"

$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")
如果有更紧凑/优雅的方式,我真的很想知道

编辑2 我发布了一个带有通用函数的答案来完成这项工作。

正如我所建议的那样,我使用了一个函数,因此它看起来更优雅:

Add-Type -AssemblyName System.Drawing

$Username="Steve"

$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
    //these two
    $graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::NearestNeighbor
    $graphics.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::Half
}

可通过

找到任何可用于c#的内容,也可用于powershell。如果您找到一个好的示例/实现,您可以将c代码转换为powershell脚本。例如:如果您想要一个更紧凑/优雅的脚本,请在单独的函数中抽象矩形复制:)此外,请随时将您的解决方案作为答案发布(自我回答很好,即使您获得了声誉分数,也鼓励您这样做):)