タイダログ

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

PowerShell で画像に黒塗りを入れる

PowerShell で画像の隠したい部分を塗りつぶす話です。何枚もある画像をまとめて処理できます。


ブログの執筆やマニュアル作成でスクリーンショットを貼るときに、画像の一部分を隠したいことはないでしょうか。たとえばブラウザのアドレスバーの URL や、SNS のアカウント名など。画像が複数枚あると手作業ではしんどいですし、マニュアル作成で画像が1枚ということはないでしょう。

複数の画像同じ箇所を塗りつぶす。そんなときに役立つスクリプトPowerShell で書きました。以前書いたスクリプトと合わせればマニュアル作成における画像処理の部分が楽になると思います。その分内容に時間を割けますね早く帰れますね。

できること

  • 複数の画像の同じ個所(同じ座標)を黒く塗りつぶす
  • 塗りつぶしの色を指定する

実行結果

塗りつぶしの入った画像が出来上がります。元の画像はそのまま残っています。

f:id:taidalog:20210309004139p:plain
塗りつぶし前

f:id:taidalog:20210309004206p:plain
塗りつぶし後

コード

function 版

Gist でご覧ください。
このリポジトリの中の Add-BlackBarToImage です。

taidalog/pista-image - GitHub

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

必要最低限のコード

前回同様、このページには必要最低限のコードを載せておきます。これをコンソール画面にコピペすれば動くはずです。

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

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

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

# 塗りつぶす範囲の座標
[int]$TopLeftX = 0
[int]$TopLeftY = 0
[int]$BottomRightX = 0
[int]$BottomRightY = 0


Add-Type -AssemblyName System.Drawing

# creating image object
$bitmap = [System.Drawing.Bitmap]::new($Path)
$graphics = [System.Drawing.Graphics]::FromImage($bitmap)

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

# 枠を描くための brush を作る
# 上で作成した色を使う
$brush = [System.Drawing.SolidBrush]::new($color)

# 塗りつぶす範囲の幅と高さを求める
$maskWidth = $BottomRightX - $TopLeftX
$maskHeight = $BottomRightY - $TopLeftY

# 塗りつぶす範囲を指定するための rectangle を作る
$rectangle = [System.Drawing.Rectangle]::new($TopLeftX, $TopLeftY, $maskWidth, $maskHeight)

# 上で定義した brush と rectangle を使って塗りつぶす
$graphics.FillRectangle($brush, $rectangle)

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

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

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

使い方

以下のパラメータを設定してください。

パラメータ 意味
$Path 黒塗りを入れたい画像へのフルパス
$DestinationPath 処理後の画像を保存するフルパス
$Alpha 黒塗りの色の ARGB値
$Red 黒塗りの色の ARGB値
$Green 黒塗りの色の ARGB値
$Blue 黒塗りの色の ARGB値
$TopLeftX 黒塗りの左上の角の X 座標
$TopLeftY 黒塗りの左上の角の Y 座標
$BottomRightX 黒塗りの右下の角の X 座標
$BottomRightY 黒塗りの右下の角の Y 座標

function 版の場合はパイプラインからの入力を受け付けますので、このようにできます。

ls *.png | Add-BlackBarToImage -Red 255 -Green 255 -Blue 255 -TopLeftX 200 -TopLeftY 50 -BottomRightX 1680 -BottomRightY 80

スプラッティングを使うとこうですね。

$color = @{
    Red = 255
    Green = 255
    Blue = 255
}

$coordinates = @{
    TopLeftX = 200
    TopLeftY = 50
    BottomRightX = 1680
    BottomRightY = 80
}

ls *.png | Add-BlackBarToImage @color @coordinates

既知の問題

  • 元画像のパスに半角スペースや半角カッコが入っているとエラーが出る
  • 隠す位置の座標を調べるのがめんどう
  • PowerShell から実行するのがめんどう

参考にしたページ

こちらもどうぞ

taidalog.hatenablog.com

taidalog.hatenablog.com

更新履歴