【发布时间】:2022-01-22 04:57:25
【问题描述】:
我正在尝试在 PowerShell 中调整图像大小而不保存临时文件,然后将其保存到 Active Directory。
我正在从数据库中获取字节数组(我无法控制发送给我的内容),并且我可以像这样轻松地将其保存为文件:
[System.Io.File]::WriteAllBytes("C:\PathToFile\img.jpg", $PhotoArray)
我需要做的是调整图像大小,然后更新 Active Directory 中的缩略图。我可以使用原始文件执行此操作,因为它已经作为字节数组提供给我,如下所示:
Set-ADUser -Identity $UserName -Replace @{thumbnailPhoto=$Photo} -Server $AdServerName
我可以使用以下代码调整图像大小以使其更小:
$Photo_MemoryStream = new-object System.IO.MemoryStream(,$PhotoAsByteArray)
$quality = 75
$bmp = [system.drawing.Image]::FromStream($Photo_MemoryStream)
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[decimal]$canvasWidth = 100.0
[decimal]$canvasHeight = 100.0
$myEncoder = [System.Drawing.Imaging.Encoder]::Quality
$encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1)
$encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($myEncoder, $quality)
$myImageCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders()|where {$_.MimeType -eq 'image/jpeg'}
$ratioX = $canvasWidth / $bmp.Width;
$ratioY = $canvasHeight / $bmp.Height;
$ratio = $ratioY
if($ratioX -le $ratioY){
$ratio = $ratioX
}
$newWidth = [int] ($bmp.Width*$ratio)
$newHeight = [int] ($bmp.Height*$ratio)
$bmpResized = New-Object System.Drawing.Bitmap($newWidth, $newHeight)
$graph = [System.Drawing.Graphics]::FromImage($bmpResized)
$graph.Clear([System.Drawing.Color]::White)
$graph.DrawImage($bmp,0,0 , $newWidth, $newHeight)
$bmpResized.Save("C:\PathToFile\img.jpg",$myImageCodecInfo, $($encoderParams))
如何将 $bmpResized 转换为字节数组,以便将其插入 Active Directory?我相信这应该很容易,但是我花了很长时间试图弄清楚如何将其转换为字节数组并且失败了!
我希望有人能找到我正在寻找的神奇答案:)
【问题讨论】:
-
$Photo = [System.IO.File]::ReadAllBytes("C:\PathToFile\img.jpg")。另外,完成后不要忘记$bmpResized.Dispose() -
还可以保存调整大小到 MemoryStream,见:stackoverflow.com/questions/7350679/…
标签: arrays powershell image-processing active-directory