#はじめに
業務でBackLogを使用していて、Wikiに業務手順を書くことが結構あります。
個人的にですが、手順書は行う手順と1つ先の作業がわかっていたほうがなんとなくわかりやすい気がします。
説明①→説明①の画像→説明②→説明②の画像→....のような構成になることが多いのだが、説明①の画像が大きすぎると次の手順が見えず、なんとなく見にくいなぁと感じます。
しかし私のように説明に画像を多用する人は、1つ1つ画像をリサイズするの結構手間がかかっていたため、
フォルダ内の画像を全てリサイズするプログラムを作成しました。
##前提条件
python 3.6
pillow
※pillowはpip install pillow
でインストールできます。
#リサイズ対象ファイル
resize.pyと同じ階層のファイルは対象にしていません。
以下のような構成の場合
rezise/
├ フォルダA/
│ └ ファイル1.jpg
│ └ ファイル2.png
│
├ フォルダB/
│ └ ファイル3.jpg
│ └ ファイル4.png
│
├ resize.py←実際に動かすプログラム
└ ファイル5.jpg
フォルダA内のファイルとフォルダB内のファイルが対象です。
そのためリサイズされるファイルは
「ファイル1.jpg」 「ファイル2.png」 「ファイル3.jpg」 「ファイル4.png」です。
同じ階層内にある「ファイル5.jpg」はリサイズされません。
##コード
import os
from glob import glob
from PIL import Image
def resize(rename):
for dir_name in all_dir:
#リサイズする拡張子を指定
extensions = ["/*.jpg", "/*.jpeg", "/*.png"]
files = []
#リサイズするデータをリストに入れる
for extension in extensions:
files.extend(glob(path + dir_name + extension))
#resize
for f in files:
img = Image.open(f)
#画像サイズを半分にする
img_resize = img.resize((int(img.width/2), int(img.height/2)))
if rename == "はい":
#ファイル名と拡張子をわける
ftitle, fext = os.path.splitext(f)
img_resize.save(ftitle + '_half' + fext)
else:
img_resize.save(ftitle + fext)
#リサイズするフォルダを指定
path = ("./")
#path直下のフォルダ名、ファイル名を取得
all_file = os.listdir(path)
#ファイル名のみにする
all_dir = [f for f in all_file if os.path.isdir(os.path.join(path, f))]
save_name = input("別名保存にしますか?(はい or いいえ)> ")
if save_name == "はい":
resize(save_name)
input("処理が完了しました。元の名前 + halfという名前で保存されています。Enterを押してください。")
elif save_name == "いいえ":
resize(save_name)
input("処理が完了しました。Enterを押してください。")
else:
input("はい or いいえで入力してください。処理を終了します。Enterを押してください。")
##プログラムの説明
元の画像サイズの半分で保存されます。
「2500px × 1250px」の画像の場合
「1250px × 625px」になります。
1/3にする場合、以下のコードの「2」を「3」にします。
#画像サイズを半分にする
img_resize = img.resize((int(img.width/2), int(img.height/2)))
指定サイズがある場合、横サイズはint(img.width/2)
を数値(1250など)に
縦サイズはint(img.height/2)
を数値(625など)にするとそのサイズにリサイズされます。
##使い方
プログラムを起動すると
別名保存にしますか?(はい or いいえ)>
とコンソールに表示されます。
はい
を入力すると、元画像と同じフォルダに「元の画像名 + half + .拡張子」で保存されます。
いいえ
を入力すると、元の画像に上書き保存されます。
##終わりに
とりあえず全ファイルを半分にするプログラムを作成しましたが、小さすぎるファイルは変換する必要がなく、大きすぎるファイルは2回変換にかける必要があります。
例えば「200px × 200px」半分にすると、小さすぎて画像が見にくかったり
逆に「3000px × 3000px」を半分にしても、「1500px × 1500px」なので、もう一度変換する必要があります。
特定の大きさ以上の場合1/3に変換し、特定のサイズ以下の場合変換を行わないなどすれば、より使いやすくなると思いました。