web-dev-qa-db-ja.com

PILを使用して画像ファイルのサイズを縮小する方法

PILを使用して、大きな画像を小さな画像に変換することで、そこにある画像のサイズを変更しています。品質をあまり損なうことなく画像のファイルサイズを縮小する標準的な方法はありますか?たとえば、画像の元のサイズが100KBであるとしましょう.

49
Yashwanth Kumar

JPEGおよびPNGを保存するための組み込みパラメーターはoptimizeです。

 >>> from PIL import Image
 # My image is a 200x374 jpeg that is 102kb large
 >>> foo = Image.open("path\\to\\image.jpg")
 >>> foo.size
  (200,374)
 # I downsize the image with an ANTIALIAS filter (gives the highest quality)
 >>> foo = foo.resize((160,300),Image.ANTIALIAS)
 >>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95)
 # The saved downsized image size is 24.8kb
 >>> foo.save("path\\to\\save\\image_scaled_opt.jpg",optimize=True,quality=95)
 # The saved downsized image size is 22.9kb

optimizeフラグは、サイズをできるだけ小さくする方法を見つけるために、画像に追加のパスを実行します。 1.9kbはそれほど多くないように思えるかもしれませんが、数百/数千枚以上の写真を追加することができます。

ここで、5 kbから10 kbに下げるために、保存オプションで品質値を変更できます。この場合、95の代わりに85の品質を使用すると、次のようになります:最適化されていない:15.1kb最適化された:14.3kb 75の品質を使用すると(引数が省略された場合のデフォルト)

品質はそれほど影響を受けず、ファイルサイズははるかに小さいため、最適化と品質85を好みます。

86
Ryan G

bookというモデルがあり、その上に「cover_pic」というフィールドがあるとしましょう。その場合、次のようにして画像を圧縮できます。

from PIL import Image
b = Book.objects.get(title='Into the wild')
image = Image.open(b.cover_pic.path)
image.save(b.image.path,quality=20,optimize=True)

つまずく人に役立つことを願っています。

9
nash

PILの画像モジュールの サムネイル 関数を参照してください。これを使用して、ファイルの小さいバージョンをさまざまなファイルタイプとして保存できます。できるだけ多くの品質を保持する場合は、ANTIALIASフィルターの使用を検討してください。

それ以外は、希望する最大サイズを指定する方法があるかどうかはわかりません。もちろん、特定のサイズが満たされるまでさまざまな品質で複数のバージョンのファイルを保存し、残りを破棄して必要な画像を提供する関数を作成できます。

2
Cryptite

PILのメインイメージマネージャーは、PILImageモジュールです。

from PIL import Image
import math

foo = Image.open("path\\to\\image.jpg")
x, y = foo.size
x2, y2 = math.floor(x-50), math.floor(y-20)
foo = foo.resize((x2,y2),Image.ANTIALIAS)
foo.save("path\\to\\save\\image_scaled.jpg",quality=95)

あなたは付け加えられます optimize=Trueは、サイズをさらに小さくしたいが、最適化はJPEGおよびPNGに対してのみ機能することを主張します。他の画像拡張機能の場合、新しく保存された画像の品質を低下させる可能性があります。コードを少し削除して画像サイズを定義するだけで、新しい画像のサイズを変更できます。コードを注意深く見ると、これを行う方法しかわかりません。このサイズを定義しました:

x, y = foo.size
x2, y2 = math.floor(x-50), math.floor(y-20)

(ほぼ)通常水平イメージで何が行われるかを示すためです。垂直画像の場合:

x, y = foo.size
x2, y2 = math.floor(x-20), math.floor(y-50)

。ただし、そのコードの一部を削除して、新しいサイズを定義できます。

0
Song