xlogI125’s blog

パソコン作業を効率化したい

PowerShell練習 [Graphics]::FromImage(Bitmap)

メモ

  • jpegファイルの大きさ(ピクセル)を変更するための応急的な手段としてPowerShellで System.Drawing.Bitmap を使用する
  • 取扱い可能なイメージの大きさ(ピクセル)、ビットの深さは気にしない

使い捨てスクリプト

  • 元のjpeg画像の縦横ピクセルを0.5倍にしたjpeg画像を新たに保存
  • [Graphics]::FromImage で 画像に文字列(DrawString)、四角形(DrawRectangle)、線(DrawLine)を描画
# PowerShell 5.1, Windows 11

using assembly System.Drawing
using namespace System.Drawing

$img = [Image]::FromFile(
  "${env:USERPROFILE}\Desktop\tmp\写真001.jpg")

Write-Host @"
幅: $($img.Width)
高さ: $($img.Height)
水平方向の解像度: $($img.HorizontalResolution)
垂直方向の解像度: $($img.VerticalResolution)
ビットの深さ: $([Image]::GetPixelFormatSize($img.PixelFormat))
"@

# イメージの幅と高さを設定
$bmp = [Bitmap]::new(
  $img.Width * 0.5, $img.Height * 0.5, [Imaging.PixelFormat]::Format24bppRgb)

# イメージの解像度を設定
$bmp.SetResolution(
  $img.HorizontalResolution * 0.5, $img.VerticalResolution * 0.5)

$g = [Graphics]::FromImage($bmp)

$g.DrawImage($img, 0, 0, $bmp.Width, $bmp.Height)

$g.DrawString(
  "参考資料", 
  [Font]::new("MS ゴシック", 28), 
  [SolidBrush]::new([Color]::FromArgb(192, 0, 0)), 
  20 / 25.4 * $bmp.HorizontalResolution, 10 / 25.4 * $bmp.VerticalResolution)

$g.DrawRectangle(
  [Pen]::new([Color]::FromArgb(192, 0, 0), 2 / 72 * $bmp.HorizontalResolution), 
  20 / 25.4 * $bmp.HorizontalResolution, 10 / 25.4 * $bmp.VerticalResolution, 
  50 / 25.4 * $bmp.HorizontalResolution, 10 / 25.4 * $bmp.VerticalResolution)

$g.DrawLine(
  [Pen]::new([Color]::FromArgb(192, 0, 0), 2 / 72 * $bmp.HorizontalResolution), 
  0, 0, $bmp.Width, $bmp.Height)

$g.DrawLine(
  [Pen]::new([Color]::FromArgb(192, 0, 0), 2 / 72 * $bmp.HorizontalResolution), 
  0, $bmp.Height, $bmp.Width, 0)

$g.Flush([Drawing2D.FlushIntention]::Sync)

$g.Dispose()

$bmp.Save(
  "${env:USERPROFILE}\Desktop\tmp\写真001_new.jpg", 
  [Imaging.ImageFormat]::Jpeg)

Write-Host @"
幅: $($bmp.Width)
高さ: $($bmp.Height)
水平方向の解像度: $($bmp.HorizontalResolution)
垂直方向の解像度: $($bmp.VerticalResolution)
ビットの深さ: $([Image]::GetPixelFormatSize($bmp.PixelFormat))
"@

$bmp.Dispose()

$img.Dispose()