Python 画像圧縮

Ammar Ali 2024年2月15日
Python 画像圧縮

このチュートリアルでは、Python で PIL ライブラリを使用して画像を圧縮する方法について説明します。

PIL ライブラリを使用する前に、pip または python を使用してインストールします。

pip install Pillow

PIL ライブラリを使用した Python 画像圧縮

画像圧縮は、画像のサイズを縮小するために使用されます。 画像は、色または強度の値を含むピクセルで構成されていることがわかっています。

画像のサイズを縮小または圧縮するには、主に 2つの方法があります。 1つの方法は、画像のサイズを変更して、存在するピクセル数を減らすことです。

たとえば、画像が 500 x 500 ピクセルの場合、ピクセル数を 500 x 500 から 100 x 100 ピクセルに減らすことで、画像を圧縮したり、ファイル サイズを縮小したりできます。 結果の画像は圧縮されますが、サイズが小さくなり、ファイル サイズも小さくなります。

ピクセル数を減らせば減らすほどファイルサイズは小さくなりますが、画像は小さくなります。 適切に表示するには、サイズ変更された画像をズームする必要がある場合があります。

PIL ライブラリの Image モジュールの resize() 関数を使用して、画像のサイズを変更できます。 resize() 関数の基本的な構文は次のとおりです。

MyImage.resize(size, resample, box, reducing_gap)

上記のコードでは、MyImage は、入力画像を含む Image モジュール オブジェクトです。 size パラメータには出力画像のサイズが含まれており、(width, height) のような 2つの値のタプルにする必要があります。

resample パラメーターはオプションであり、デフォルトでは None に設定されており、PIL.Image.Resampling.NEAREST のように画像を滑らかにするために画像に適用されるリサンプリング フィルターを設定するために使用されます。 フィルターは、最も近いピクセルを使用して各ピクセルを平滑化します。

box パラメータはオプションで、デフォルト値は None に設定されており、画像の関心領域を設定するために使用されます。box パラメータは、ボックスの位置を含む4つの値のタプルである必要があります。例:(0,0,width,height)

reducing_gap もオプションの引数であり、画像に最適化を適用するために使用されます。これにより、画像のサイズがさらに縮小されます。デフォルトでは、その値は none に設定されています。

reducing_gap の値は整数でなければなりません。 値が小さいほどサイズ変更が速く、値が大きいほどサイズ変更は遅くなりますが、より良い結果が得られます。

たとえば、resize() 関数を使用して画像を圧縮してみましょう。 以下のコードを参照してください。

from PIL import Image

input_img = Image.open("test.jpg")
print("input image size:", input_img.size)

output_img = input_img.resize((300, 300))
print("output image size:", output_img.size)
output_img.save("testNew.jpg")

出力:

input image size: (600, 600)
output image size: (300, 300)

サイズ変更された画像

上記のコードでは、PIL ライブラリの Image モジュールの open() および save() 関数を使用して、画像を開いて保存しました。

画像と Python コード ファイルが同じディレクトリにあるため、open() 関数で画像の名前と拡張子のみを指定しましたが、それらが同じディレクトリにない場合は、完全な拡張子を指定する必要があります。 画像ファイルへのパスとその名前と拡張子を読み取ります。

また、save() 関数で画像の名前と拡張子を使用しました。これにより、Python コード ファイルの現在のディレクトリに画像が保存されますが、完全なパスを指定することで別のディレクトリに画像を保存することもできます。 イメージ名と拡張子。

上の写真では、左側の画像が元の画像です。 そのサイズは 21.6 kb で、右側の画像はリサイズされた画像で、そのサイズは 6.88 kb です。

右側の画像は 200% にズームされているため、元の画像と簡単に比較して、両方の画像のわずかな品質の違いを確認できます。

上記の例では、オプションの引数を使用していませんが、それらを使用して出力画像の品質を向上させることができます。

画像を圧縮するもう 1つの方法は、画像の品質を下げることです。 この方法では、画像のピクセル数は同じままですが、画像の品質は画像のファイル サイズとともに低下します。

save() 関数内で optimize および quality 引数を使用して、画像のファイル サイズを縮小できます。

optimize 引数は true に設定され、画像に最適化を適用します。これにより、品質をあまり損なうことなくサイズが縮小されます。quality 引数は、1 から 100 までの任意のパーセンテージに設定できます。

品質を 50% に設定すると、画像ファイルのサイズは半分になります。 たとえば、上記の例でファイル サイズを縮小するためだけに save() 関数を使用してみましょう。

以下のコードを参照してください。

from PIL import Image

input_img = Image.open("test.jpg")
output_img = input_img.save("testNew.jpg", optimize=True, quality=50)
input_img_2 = Image.open("testNew.jpg")
print("Input image size:", input_img.size)
print("Output Image Size:", input_img_2.size)

出力:

Input image size: (600, 600)
Output Image Size: (600, 600)

画像の品質を下げる

上記の出力では、入力画像と出力画像のピクセル数が同じであり、出力画像の品質が低下していることがわかります。 左の画像が元の画像で、右が出力画像です。

両方の例を比較すると、両方の出力画像の品質はほぼ同じですが、最初の例の出力画像のピクセル サイズは、2 番目の例の出力画像のピクセル サイズよりも小さくなっています。 resize()save() 関数を組み合わせて、必要な結果を取得することもできます。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - Python Image