Pythonの画像処理ライブラリPillow(PIL)で画像のトリミング、サイズ変更、保存をしてみる

目次

Pillow(PIL)

ブログを運営していて煩雑になるのは、画像の処理。

大きいままだとサーバーの容量を逼迫してしまうし、小さすぎたり、解像度が低すぎたりすると画像がみづらくなってしまいます。

3PySciでは撮影したり、スクリーンショットしたりした画像で必要なところを切り抜き、長辺を1000ピクセルとなるように加工してから、アップロードしています。

もちろん名前も変更しなければいけません。

そんな煩雑な作業をプログラムで改善できないか。

もう400以上も記事を書いていて、今更ながらに思ったわけです。

ということで画像を自動で処理してくれるプログラムの作成に取り掛かっていきますが、まずは画像処理のライブラリを勉強していこうと思います。

その画像処理のライブラリというのがPillow、別の名をPIL(Python Image Library)といいます。

今回はこのPillowの簡単な使い方を解説していきましょう。

もしインストールされていない方はこちらの記事を参考にインストールしてみてください。

画像はPixabayよりダウンロードしたこちらの画像(pillow1-1.png)を使っていきます。

画像の読み込み

まずはPillowを使って処理する画像を読み込みましょう。

<セル1>

from PIL import Image

im = Image.open("Figure.jpg")

im

実行結果

最初の行はPillow(PIL)の「Image」というモジュールのインポートです。

from PIL import Image

次の行で変数imに読み込んだ画像を格納しています。

im = Image.open("pillow1-1.jpg")

最後の「im」で画像を表示しています。

思ったよりも簡単にできたと思います。

画像サイズの取得

この後、トリミングやらサイズ変更やらをしていくに当たって、画像のサイズが必要になるので、最初に取得してみましょう。

画像のサイズを取得するには「画像名.size」を使います。

<セル2>

print(im.size)

実行結果
(1920, 1280)

画像をトリミング

次に画像をトリミングする方法を見ていきましょう。

トリミングする際はトリミングして残す範囲を「画像名.crop((左、上、右、下))」でそれぞれ左上を起点としたピクセルを入力します。

この際、範囲は二つの括弧でかこってあることに注意してください。

まずは左をトリミングしてみます。

<セル3>

crop_left = im.crop((500, 0, 1920, 1280))

crop_left

実行結果

次に上をトリミングしてみます。

<セル4>

crop_upper = im.crop((0,500,1920,1280))

crop_upper

実行結果

次に右をトリミングしてみます。

<セル5>

crop_right = im.crop((0, 0, 1420,1280))

crop_right

実行結果

最後に下をトリミング。

<セル6>

crop_lower = im.crop((0, 0, 1920,780))

crop_lower

実行結果

ちなみにトリミングして残す範囲を括弧一つで入力してしまうとこんなエラーがでます。

crop_lower = im.crop(0, 0, 1920,780)

crop_lower

実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-75930be12fa8> in <module>
----> 1 crop_lower = im.crop(0, 0, 1920,780)
      2 
      3 crop_lower

TypeError: crop() takes from 1 to 2 positional arguments but 5 were given

画像のサイズ変更

次に画像のサイズ変更をしてみましょう。

サイズ変更には「画像名.resize(サイズ変更後の横、サイズ変更後の縦)」を使います。

<セル7>

resized = im.resize((1000, 1280))

print(resized.size)

resized

実行結果
(1000, 1280)

画像の保存

画像の保存は「画像名.save(保存する画像名)」です。

<セル8>

resized.save("resized.png")

実行結果

これで大体やりたいことはできそうです。

ただしサイズ変更が縦横比が変わってしまっているので、この点はプログラムで修正が必要になりそうです。

次回は縦横比を変えない状態でサイズ変更する方法を探っていきましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる