.net - Powershell 在 System.Drawing 中使用 .NET .DrawImage
问题描述
我正在制作一个工具,可以自动裁剪和定位,而无需将图像大小调整为其他图像。我在 .NET 的 microsoft docs 上找到了这个,但我不明白如何在我的代码中实现。到目前为止,我可以从 Mojang API 下载图像,例如:
我想知道是否可以在坐标 8,0 处裁剪一个 8x8 像素的矩形并将其粘贴到坐标 8,8 处的 Steve.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
我发布了一个带有通用功能的答案来完成这项工作。
解决方案
正如@Mathias R. Jessen所建议的,我使用了一个函数,所以它看起来更优雅:
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
}
通过这个线程找到
推荐阅读
- magento - 切换主页语言
- python - a 和 b 的导数,使用算法微分
- android - ashmem 给予 [Errno 13] 权限被拒绝
- python - 从多个 JSON 文件中提取特定元素并添加到单个 Excel 中
- google-apps-script - 来自 Webhook 的 WebApp postData 间歇性地将 Google 从 Missive 空白到 Google Apps 脚本
- android - 将 Ionic 限制为仅限 Android 上的智能手机设备
- python - 如何诊断为什么我的 python 内核死了?
- c++ - 从 C++ 中 int main() 中的无序映射调用函数时,在非成员函数中使用“this”无效
- c++ - NVIDIA 的 Tensorflow 中缓慢(失败)的内存分配
- java - 对象和字符串的映射