みなさん、こんにちは。
PYTHONを使って画像ファイルを圧縮化、大きさを縮小するプログラムを紹介します。
プログラムを作成する経緯
デジカメやスマホで撮影した画像をSNS(TwitterやInstagram)やブログに投稿しようとする時、ファイルサイズが大きいとアップロードに時間がかかります。また、閲覧する側にとっても、画像の読み込みに時間がかり、不便ですよね。
その為、画像編集ソフトを使って、画像のファイルサイズを小さく(圧縮や画像サイズを縮小)しているのではないでしょうか。
画像の数が少なければ、画像編集ソフトでファイルサイズを小さくでしても不便はありませんが、複数ある場合、面倒です。大体の画像編集ソフトは、画像ファイルを一括で、圧縮、サイズ変更する機能を備えていません。
そこで、PYTHONで一括で画像ファイルのサイズの縮小化処理をできないかと思い、今回のプログラム作成に至りました。
プログラムの内容
作成するプログラムの内容は以下の通りです。
- フォルダ内の画像を一括処理
- 処理した画像に”new”と名前に付加して、元の画像は残しておく
- 画像を高画質で圧縮する
- 画像の大きさを縮小する
✔ フォルダ内の画像を一括処理します。但し、元の画像は残しておきたいので、処理した画像に対しては、「new」という言葉を名前に付加するようにします。
✔ 圧縮に対しては、出来るだけ画質を落とさないようにします。
✔ ファイルサイズを小さくするには、画像の大きさを縮小することが一番有効です。デジカメやスマホで撮影した時の画像の大きさは、高さ2000pixel、幅4000pixelぐらいの物がほとんどで、かなり大きいサイズになります。その為、半分に縮小しても見た目はほとんどわかりません。
使用するライブラリ PIL(pillow)、os
今回使用するライブラリは「画像処理ライブラリPIL(pillow)」になります。
インストールされていない方は、下記のコマンドでインストールして下さい。
pip install pillow
また、「os」はpythonの標準ライブラリなのでインストールする必要はありません。フォルダ内のファイル取得の際に使用します。
プログラムコード
では、プログラムコードの説明に入りたいと思います。
import os
from PIL import Image
bairitsu=4
folder_a ='C:/Labo/image/'
list1 = os.listdir(folder_a)
for i in range(len(list1)):
imagefile = os.path.join(folder_a, list1[i])
imagedata = Image.open(imagefile)
width, height = imagedata.size
width2 = width/bairitsu
height2 = height/bairitsu
imagedata2= imagedata.resize((int(width2),int(height2)))
newimage = folder_a + "new" + list1[i]
imagedata2.save(newimage, quality=85,optimize=True)
1、2行目 ライブラリのインポート
PIL(pillow)からImageをインポートします。
4行目 画像の縮小倍率
画像サイズの縮小倍率を定義します。
今回は「4分の1」のサイズに縮小させます。
6行目 画像の保存フォルダ
縮小化したい画像が保存されているフォルダを指定します。また、縮小化した画像もこのフォルダに保存します。
8行目 フォルダの画像ファイルをリスト化
os.listdir(フォルダ)で、フォルダ内の画像ファイルをリスト化します。
list1 = os.listdir(folder_a)
11行目 画像ファイルを開く
Image.openを使用し画像ファイルを開きます。
画像ファイルを開くときに、ファイルにパスが入っていないと、どこにファイルがあるかわからないので、os.path.joinを使用してパス名を加えます。
imagefile = os.path.join(folder_a, list1[i])
imagedata = Image.open(imagefile)
13行目 画像サイズ
画像の縦、横のサイズを知る為には下記のように書きます。
width, height = imagedata.size
14~16行目 画像サイズの縮小
画像サイズの縮小を行います。
resize(変更したい横の長さ、変更したい縦の長さ)で、画像のサイズの変更を行います。
resizeの引数は整数にする必要があるので、整数の変換(int)をしています。
width2 = width/bairitsu
height2 = height/bairitsu
imagedata2= imagedata.resize((int(width2),int(height2)))
17,18行目 ファイル保存、画質の指定
newimage = folder_a + "new" + list1[i]
imagedata2.save(newimage, quality=85,optimize=True)
新しいファイル名を決めます。元ファイルと区別させる為に、元ファイルの名前の頭に”new”と付けています。
次に、今回のメインのファイルの保存です。
qualityで画像の質を決めます。数字が高いと画質が高いことになります。100がMaxになります。私の感覚ですが、色々と試した結果、85未満だと、画像の粗さが気になりました。そういうことで85にしています。
optimizeは不要な色を削除するという最適化するオプションになります。ファイルサイズとしてはわずかに縮小するので、optimizeはTrueにして下さい。
以上で完成です。
qualityの違い
qualityを25, 45, 65, 85, 95で変更した時の画像です。クリックすると画像が大きく表示されます。
見た目は同じようですが、大きくすると、細かい所の粗さが目立ってきます。
下記がqualityとファイルサイズの表になります。因み(ちなみに)に元の画像のファイルサイズ2479kbなので、かなり小さくなっています。これは画像を4分の1にしたことが影響していると思います。
quality | ファイルサイズ |
---|---|
25 | 64kb |
45 | 93kb |
65 | 123kb |
85 | 197kb |
95 | 336kb |
まとめ
いかがだったでしょうか。
最近は園芸のブログを書くことが多く、植物の写真をブログにアップロードする際の画像の圧縮作業に困っていました。しかし、上記のプログラムを作って、圧縮作業が簡単に済むことが出来ました。
ネットには一括処理するサービスがありますが、PYTHONを使えば、ローカル上で処理が出来るので、処理速度が増し非常に便利です。また、自分でコードを書いてプログラムを作成する楽しみがあります。
是非、みなさんも参考にして下さいね。
「役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!
コメント