IrfanViewとは
知る人ぞ知る、昔ながらのWindowsの画像処理向けの無償ツール。
ディレクトリ内の画像を確認したり、ディレクトリ内のファイルを一気に画像を変換したり出来る便利なやつ。
Windows 95時代から存在する古参だ。
IrfanViewの仕様など
こいつ、なんとコマンドプロンプトからの直接のコマンドを受け付ける。
今となれば、一括変換はOpenCVがPythonにデフォルトで付いているのであまり需要はないかもしれないが・・・
表示したり画像処理をかけたりといった作業に対しては、わざわざPyQtやwxPython、tkinterなどで画像処理専用の画面を作らなくても良いので、専用の画像処理ツールがない環境でまじめに画像表示を作らなくていい場合、最もチープな画像確認ツールとして今でも使えると思う。
そんなIrfanViewを、Pythonを使って外部実行する。
考え方
- subprocess.Popenで非同期処理でIrfanViewを実行する
- 同期処理だと、PythonはIrfanViewの処理終了まで待機する必要があるため
- 非同期にすれば、コマンドを送ったりやボタンをちまちま押すだけで好きな画像を表示するツールが出来る
- IrfanViewは大体Program Filesフォルダにi_view64.exe(64bit版の場合)みたいな感じで格納されている
- 環境変数を設定するか、jsonファイルか何か用意してダイレクトに設定を書いてしまおう
{
"Extension" : {
"Path_irfanview" : "C:\\Program Files\\IrfanView\\i_view64.exe"
}
}
コマンド集
英語だが、日本語版もどっかにあったはず
最近では、ライブラリがあれば一括変換などは簡単にやってくれるので、あくまで表示する機能を使うにとどめる
あると便利そうなのは
- /bs
- 画像をディスプレイの大きさに合わせて表示
- /crop, /resize, /resample
- 画像サイズの変更や切り抜き
- /gray, /rotate_h, /hflip, /sharpen, /contrastなどの
- 画像処理関係の処理
ソースコード
こんな感じのソースコードを書くだけでirfanviewを立ち上げることが出来る
画像処理をかけることも可能.
ただし同一ディレクトリの画像ファイルに移動すると、その画像が読み込まれて、画像処理内容も消えてしまう。
import subprocess
from subprocess import PIPE
tr_path = "test.bmp"
tr_area = "/crop=({0},{1},{2},{3})".format(50, 100, 50, 50)
tr_title = "/title=切り抜き画像 注目座標:({0}, {1})".format( 50, 100)
proc = subprocess.Popen( [self._graph_parameter["Extension"]["Path_irfanview"],
tr_path, tr_area, tr_title, "/bf"], stdout=PIPE, stderr=PIPE)
複数枚の指定したファイル名の画像のみ読み取る場合はこちら
画像処理は効かないので注意
import subprocess
from subprocess import PIPE
tr_path1 = "test1.bmp"
tr_path2 = "test2.bmp"
proc = subprocess.Popen( [self._graph_parameter["Extension"]["Path_irfanview"],
tr_path1, tr_path2], stdout=PIPE, stderr=PIPE)
Popenをイベントごとに送るようにすると、irfanViewが立ち上がって、指定した画像を読み取ってくれる
感想
Popen1行で画像が表示できる点は良い。
テストするときなどに使えると思う。
あくまでテスト用途なので、この機能を主機能にした設計はあまり望ましくない。