ペイントで絵や図を素早く描き始める&管理する仕組みをバッチファイルで整えた

背景

ちょっとした絵や図を描くのに私はペイント(mspaint.exe)を使うのだが、何の仕組みも整えてないと、

  • mspaint.exe を開く
  • キャンバスのサイズを調整する
  • 描く
  • 保存する
    • ファイル名を考える
    • 保存場所を考える

ただ描きたいだけなのにこれだけの作業が発生する。しんどい。もっと効率化できないか。

解決策

Canvasp というシステム(というかバッチファイル)を作った。

new.bat を起動して「利用したいキャンバスサイズ」と「タイトル」を入力するだけで、そのサイズで初期化された白紙キャンバスがペイントで開かれる……というもの。

ファイル名は (生成日時)_(タイトル).jpg で保存するため、保存時の名前や場所を考える必要はない。その上、ファイル名でソートすれば時系列に並ぶため、後から見返しやすい。

実装の話

以下細かい実装の話。

キャンバスのつくりかた

指定サイズの白紙画像をあらかじめ用意しておいて、それを複製するというアプローチを取ってみた。

たとえば 1024x768の白紙画像はこんな感じ で、あらかじめ用意しておく。

「1024x768の白紙画像で描きたい!」という時は、これをコピーしたものをペイントで開けばいいわけだ。

new.bat の中身について

set cnt=0
for /F "usebackq" %%i in (`dir /b 0_*.jpg ^| sort`) do (
    set /a cnt=!cnt!+1
    echo !cnt!: %%i
)

あらかじめ用意してる白紙画像(名前が 0_ から始まる jpg ファイル)を dir /b 0_*.jpg でリストアップし、それを sort に食わせて昇順に並べている。並べたファイル名一つ一つについて、選択肢の番号を印字してユーザーに見せている。それを、

:select_retrying
set /p input_num="Input the number you want to use>>>";

set cnt=0
set targetfilename=NOT_FOUND
for /F "usebackq" %%i in (`dir /b 0_*.jpg ^| sort`) do (
    set /a cnt=!cnt!+1
    if "%input_num%"=="!cnt!" (
        set targetfilename=%%i
        break
    )
)

set /p でプロンプトを出してユーザーに選ばせ、入力された番号に該当するファイルをもう一度同じループで回して探すことで取り出す。

echo Target is %targetfilename%
if "%targetfilename%"=="NOT_FOUND" (
    goto :select_retrying
)

入力した番号がおかしかったらやり直し。

set /p yourcomment="Input the comment>>>";
set datebase=%date%
set timebase=%time%
set shortdate=%datebase:/=%
set shortdate=%shortdate:~2,6%
set shorttime=%timebase::=%
set shorttime=%shorttime:~0,6%
set shortdatetime=%shortdate%_%shorttime%
set filename=%shortdatetime%_%yourcomment%.jpg

続いて set /p で今度はコメントを入力してもらい、入力後はファイル名の文字列を作っている。長々と書いているけど大半は日付時刻文字列をつくるおまじない。

copy %targetfilename% %filename%
start "" mspaint.exe "%filename%"

で、最後に、選ばれた白紙画像を、作ったファイル名でコピーして、そいつをペイントで開いてやる。start "" を使っているのは、こうしないとバッチファイル自体がブロッキングしちゃうから。

おわりに

バッチファイルだけでも工夫すれば結構省力化できるんだなあと勉強になった。