Private/Convert-Base64Image.ps1
function Convert-Base64Image { param ( [Parameter(Mandatory = $true)] [string]$base64String, [string]$outputPath = [System.IO.Path]::GetTempFileName() ) try { # Decode the base64 string to a byte array $imageBytes = [Convert]::FromBase64String($base64String) # Write the byte array to a temporary file [System.IO.File]::WriteAllBytes($outputPath, $imageBytes) # Determine platform and use appropriate image resizing approach if ($PSVersionTable.PSEdition -eq 'Core') { # Check if running on Windows if ($IsWindows) { # On Windows with PowerShell Core, we can still use System.Drawing Add-Type -AssemblyName System.Drawing $image = [System.Drawing.Image]::FromFile($outputPath) $resizedImage = New-Object System.Drawing.Bitmap 64, 64 $graphics = [System.Drawing.Graphics]::FromImage($resizedImage) $graphics.DrawImage($image, 0, 0, 64, 64) $memoryStream = New-Object System.IO.MemoryStream $resizedImage.Save($memoryStream, [System.Drawing.Imaging.ImageFormat]::Png) $resizedBytes = $memoryStream.ToArray() $resizedBase64 = [Convert]::ToBase64String($resizedBytes) # Clean up resources $graphics.Dispose() $resizedImage.Dispose() $image.Dispose() $memoryStream.Dispose() } elseif ($IsMacOS) { # macOS approach using sips command $tempResized = [System.IO.Path]::GetTempFileName() $sipsCommand = "sips -Z 64 '$outputPath' --out '$tempResized'" $null = Invoke-Expression $sipsCommand $resizedBytes = [System.IO.File]::ReadAllBytes($tempResized) $resizedBase64 = [Convert]::ToBase64String($resizedBytes) # Clean up temp file if (Test-Path $tempResized) { Remove-Item $tempResized -Force } } else { # Linux approach using ImageMagick if available if (Get-Command "magick" -ErrorAction SilentlyContinue) { $tempResized = [System.IO.Path]::GetTempFileName() $magickCommand = "magick '$outputPath' -resize 64x64 '$tempResized'" $null = Invoke-Expression $magickCommand $resizedBytes = [System.IO.File]::ReadAllBytes($tempResized) $resizedBase64 = [Convert]::ToBase64String($resizedBytes) # Clean up temp file if (Test-Path $tempResized) { Remove-Item $tempResized -Force } } else { # Fallback if no image processing tool is available Write-Warning "No image processing library available. Returning original image." $resizedBase64 = [Convert]::ToBase64String($imageBytes) } } } else { # PowerShell Desktop approach - using System.Drawing Add-Type -AssemblyName System.Drawing $image = [System.Drawing.Image]::FromFile($outputPath) $resizedImage = New-Object System.Drawing.Bitmap 64, 64 $graphics = [System.Drawing.Graphics]::FromImage($resizedImage) $graphics.DrawImage($image, 0, 0, 64, 64) $memoryStream = New-Object System.IO.MemoryStream $resizedImage.Save($memoryStream, [System.Drawing.Imaging.ImageFormat]::Png) $resizedBytes = $memoryStream.ToArray() $resizedBase64 = [Convert]::ToBase64String($resizedBytes) # Clean up resources $graphics.Dispose() $resizedImage.Dispose() $image.Dispose() $memoryStream.Dispose() } return $resizedBase64 } catch { Write-Error "Error processing image: $_" } finally { # Clean up temporary file if (Test-Path $outputPath) { Remove-Item $outputPath -Force } } } |