2025/11/05(水) [n年前の日記]
#1 [tkinter] tkinterを使って縮小画像生成アプリを作成中。その2
Python + tkinter + ImageMagick を使って、親父さんのWebサイト更新作業を楽にするためのGUIアプリを作成中。
環境は Windows11 x64 25H2 + Python 3.10.10 64bit + tkinter + tkinterdnd2 0.4.3。
環境は Windows11 x64 25H2 + Python 3.10.10 64bit + tkinter + tkinterdnd2 0.4.3。
◎ ImageMagickの呼び出しでハマった :
縮小画像の作成には、ImageMagick (magick.exe) を使いたい。つまり外部コマンドを呼び出す形になる。Python の場合、subprocess なるモジュールを使えば外部コマンドを呼び出せるらしいけど…。一般的には subprosess.run(["コマンド", "オプション"]) という形になるらしい。
しかし、試してみたところ、どうも上手く行かない…。妙なエラーばかり出る…。
原因が分かった。subprocess.run() に空白を含むパスを渡そうとした際、気を効かせたつもりで「"」でパスを挟んでから渡していたのがマズかった模様。そのあたりは subprocess.run() 側でイイ感じに処理してくれるらしいので、空白を含んだパスだろうと含んでないパスだろうとそのまま渡してしまえばいい。
更に、ImageMagick に渡すオプション文字列を、空白を含めた状態で渡してしまっていたのもマズかった模様。空白を区切り文字にして文字列を分割してリストにしてから渡してみたら動いてくれた。
以下のような感じになった。
infile, outfile には空白を含んだファイルパスが入ってるけれど、そのままリストに登録して動いてくれた。また、オプション文字列は空白で分割( .split(" ") )してリストに追加している。
しかし、試してみたところ、どうも上手く行かない…。妙なエラーばかり出る…。
原因が分かった。subprocess.run() に空白を含むパスを渡そうとした際、気を効かせたつもりで「"」でパスを挟んでから渡していたのがマズかった模様。そのあたりは subprocess.run() 側でイイ感じに処理してくれるらしいので、空白を含んだパスだろうと含んでないパスだろうとそのまま渡してしまえばいい。
更に、ImageMagick に渡すオプション文字列を、空白を含めた状態で渡してしまっていたのもマズかった模様。空白を区切り文字にして文字列を分割してリストにしてから渡してみたら動いてくれた。
以下のような感じになった。
im_opt = "-colorspace RGB -filter Lanczos -define filter:blur=.9891028367558475 -distort Resize {SIZE}x{SIZE} -colorspace sRGB -quality 90"
def get_resize_command(infile: str, outfile: str, size: int):
"""ImageMagickを使って画像をリサイズするためのコマンドリストを取得"""
cmd = []
cmd.append("magick")
cmd.append(infile)
optstr = im_opt.replace("{SIZE}", str(size)).split(" ")
for s in optstr:
cmd.append(s)
cmd.append(outfile)
return cmd
infile, outfile には空白を含んだファイルパスが入ってるけれど、そのままリストに登録して動いてくれた。また、オプション文字列は空白で分割( .split(" ") )してリストに追加している。
[ ツッコむ ]
以上です。