LoginSignup
3
5

More than 3 years have passed since last update.

フォルダ内の画像を全て半分のサイズにする

Posted at

はじめに

業務でBackLogを使用していて、Wikiに業務手順を書くことが結構あります。
個人的にですが、手順書は行う手順と1つ先の作業がわかっていたほうがなんとなくわかりやすい気がします。
説明①→説明①の画像→説明②→説明②の画像→....のような構成になることが多いのだが、説明①の画像が大きすぎると次の手順が見えず、なんとなく見にくいなぁと感じます。

↓この説明文を
000447.jpg

↓こうしたい
000449.jpg

しかし私のように説明に画像を多用する人は、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に変換し、特定のサイズ以下の場合変換を行わないなどすれば、より使いやすくなると思いました。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5