タイダログ

もっと怠けますか? (y/n)

PowerShell で画像に枠を付ける

PowerShell で画像に外枠を付けるスクリプトを書きました。白い画像を白いページに貼り付けるときに使えます。


ブログにスクリーンショットを貼ろうとしたのですが、白い画像だったので白い背景と同化してしまいました。なので画像の周辺に黒い枠を付けるわけですが、画像が3枚もあるので非常に面倒なのです。これはやってられん。面倒なことに如何に対処してきたかを記すブログを書くのが面倒とか、そんな皮肉があるか。

という経緯で、PowerShell を使って画像に外枠を付けるスクリプトを書きました。普段はネットの海で先人の知恵をいただいてきては、ほぼコピペで使わせていただいている私ですが、今回はがんばって Microsoft Docs の .Net API Browser を読みながらほぼ自力で書きました。すごいぞ。

コード

今後も使いまわすために function 化しました。Gist でご覧ください。このリポジトリの中の Add-FrameToImage です。

taidalog/pista-image - GitHub

緑色の 'Code' ボタンから 'Download ZIP' して、解凍して、フォルダ名を 'pista-image-main' から 'pista-image' に変えて、モジュールをインポートしてください。方法は「powershell module インポート」とかでググったら出ます。

とりあえずこのページには、「必要最低限これだけ書いたら動きますよ」というコードを載せておきます。これをコンソール画面にコピペすれば動くはずです。どうか動いてください。

# 画像へのフルパス
[string]$Path = ''

# 保存先へのフルパス
[string]$DestinationPath = ''

# 線の太さ
[int]$LineWidth = 1

# ARGB 値 (0-255)
[int]$Alpha = 255
[int]$Red = 0
[int]$Green = 0
[int]$Blue = 0


Add-Type -AssemblyName System.Drawing

$bitmap = [System.drawing.Bitmap]::new($Path)
$graphics = [System.Drawing.Graphics]::FromImage($bitmap)

# 枠の色を指定する
# 冒頭の引数で指定した ARGB 値を使う
$color = [System.Drawing.Color]::FromArgb($Alpha,$Red,$Green,$Blue)

# 枠を描くための pen を作る
# 冒頭の引数で指定した太さと、上で作成した色を組み合わせる
$pen = [System.Drawing.Pen]::new($color, $LineWidth)
$pen.Alignment = [System.Drawing.Drawing2D.PenAlignment]::Inset

# 枠を描く範囲を指定するための rectangle を作る
# 枠は画像の外周に描くので、画像と同じサイズの rectangle を作る
$rectangle = [System.Drawing.Rectangle]::new(0, 0, $bitmap.Width - 1, $bitmap.Height - 1)

# 上で定義した pen  rectangle を使って枠を描く
$graphics.DrawRectangle($pen, $rectangle)

# 使い終わったデータを破棄する
$graphics.Dispose()
$pen.Dispose()

# 出来上がった画像を保存する
$bitmap.Save($DestinationPath)

# 使い終わったデータを破棄する
$bitmap.Dispose()

使い方

  1. コードを丸ごとメモ帳などにコピペする
  2. $Path = の後の '' の中に画像ファイルへのパスを書く
  3. $DestinationPath = の後の '' の中に保存先のパスを書く
  4. 必要に応じて冒頭の引数を調整する($LineWidth, $Alpha, $Red, $Green, $Blue
  5. PowerShell のコンソール画面を開く(Win+X, I
  6. 書き換えたコードを全てコピーしてコンソール画面に貼り付けて Enter

# で始まっている行はコメント行なので貼り付けは不要です。

実行結果

$DestinationPath で指定した場所に枠の付いた画像が出来上がります。元の画像はそのまま残っています。

このページのコードでは画像に被せる形で枠を付けます。ですので枠が太い場合はその分画像が隠れます。以下極端な例。

f:id:taidalog:20210226002506p:plain
元画像

f:id:taidalog:20210226002526p:plain
画像の上から枠を追加

(よく見るとちょっとずれてますねぇ……下と右……)

function 版では画像の外側に枠を付けることができます(画像に被せることも可能です)。

f:id:taidalog:20210226002603p:plain
画像の外側に枠を追加

(下と右……今度直そう)

既知の問題

  • 元画像のパスに半角スペースや半角カッコが入っているとエラーが出る
  • よく見ると枠がちょっとずれている

参考にしたページ

こちらもどうぞ

taidalog.hatenablog.com

taidalog.hatenablog.com

更新履歴