こんにちは、エンジニアの tanaka です。
この記事は、ギークフィードアドベントカレンダー2024の13日目の記事です。ギークフィードの有志が毎日ブログを投稿しているので是非チェックしてみてください。
はじめに
我々エンジニアはドキュメント書きなどでスクリーンショットを撮る、それをファイル化するなど画像を扱うケースが少なからずあります。今回は PowerShell を用いクリップボードを介して画像を扱う方法を紹介します。
前提環境
今回のスクリプトは次の環境で動作を確認しています。
- Windows11
- Powershell 5.1 (わざわざもどしてしまった、、、)
クリップボードを介した画像の読み書き
PowerShell は .NET との親和性が高くスクリプトの中から .NET の API を呼びだすことができます。今回はこれを利用します。
画像保存
以下はクリップボードのイメージを Img_<日付文字列>.png というファイル名で保存する例です。わずか数行で実現できる。お手軽ですね。
1 2 3 4 5 6 7 8 9 10 |
# Clip2Img.ps1 Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing if([System.Windows.Forms.Clipboard]::ContainsImage()) { $img = [System.Windows.Forms.Clipboard]::GetImage() $fileName = [string]::Format("Img_{0:yyyyMMddHHmmssfff}.png", (Get-Date)) $img.Save($fileName, [System.Drawing.Imaging.ImageFormat]::Png) } |
画像読込
今度は逆にローカルのファイルをクリップボードに保存する方法を紹介します。ここで取り込んだ画像は、スプレッドシート、Slack 等にそのまま画像として貼り付けることができます。
こちらも同様、わずか数行で書ける。
1 2 3 4 5 6 7 8 9 10 11 |
# Img2Clip.ps1 Param($file) Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $b = [System.IO.File]::ReadAllBytes($file) $converter = New-Object System.Drawing.ImageConverter [System.Windows.Forms.Clipboard]::SetImage($converter.ConvertFrom($b)) |
実際に使ってみよう
実はここがちょっとネックになる。PowerShell の実行はデフォルトでは制限されており、そのため実行するにあたり実行ポリシーの変更が必要になります。常套手段として次のようなバッチファイルを作成し実行します。バッチファイルはメモ帳などで作ってしまえば OK。
1 2 3 4 5 |
REM Img2Clip.cmd @echo off PUSHD "%~dp0" powershell -ExecutionPolicy Bypass -command ".\Img2Clip.ps1" '%~1' |
バッチファイルに直接埋め込む方法もあるようですが、それは別の機会で、、、。
おわりに
PowerShell は便利な道具ですが(自分の周囲では)活用されている感もないためちょっと勿体なく感じています。これを機に啓蒙できれば幸いです。
The following two tabs change content below.
ギークフィードのエンジニア。楽するべく苦労する。
ネットワークスペシャリスト。
- PowerShell によるクリップボード活用術(画像編) - 2024-12-13