PowerShell で画像の隠したい部分を塗りつぶす話です。何枚もある画像をまとめて処理できます。
ブログの執筆やマニュアル作成でスクリーンショットを貼るときに、画像の一部分を隠したいことはないでしょうか。たとえばブラウザのアドレスバーの URL や、SNS のアカウント名など。画像が複数枚あると手作業ではしんどいですし、マニュアル作成で画像が1枚ということはないでしょう。
複数の画像の同じ箇所を塗りつぶす。そんなときに役立つスクリプトを PowerShell で書きました。以前書いたスクリプトと合わせればマニュアル作成における画像処理の部分が楽になると思います。その分内容に時間を割けますね早く帰れますね。
できること
- 複数の画像の同じ個所(同じ座標)を黒く塗りつぶす
- 塗りつぶしの色を指定する
実行結果
塗りつぶしの入った画像が出来上がります。元の画像はそのまま残っています。
コード
function 版
Gist でご覧ください。
このリポジトリの中の Add-BlackBarToImage です。
緑色の '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 から実行するのがめんどう
参考にしたページ
- System.Drawing Namespace | Microsoft Docs
- Bitmap Class (System.Drawing) | Microsoft Docs
- Graphics Class (System.Drawing) | Microsoft Docs
- Brush Class (System.Drawing) | Microsoft Docs
こちらもどうぞ
更新履歴
- 目次の位置を変更 (2021/09/05)
- 目次の下に「こちらもどうぞ」を追加 (2021/09/05)
- 「function 版」内の Gist へのリンクを GitHub のリポジトリへのリンクに変更 (2021/09/05)
- 「こちらもどうぞ」を追加 (2021/09/05)