私は最適化を行っており、Djangoでこれを実装する方法を探して、画像にロスレス圧縮を推奨しています。
ここに彼らが指定した画像があります。それを効果的に実行するには、ミドルウェアクラスを使用してシステム全体に実装する必要があると思います。これは、pagespeedのGoogleアナリティクスへのリンクです https://developers.google.com/speed/pagespeed/insights/?url=www.kenyabuzz.com
画像の最適化画像を適切にフォーマットして圧縮すると、データのバイト数を節約できます。次の画像を最適化して、サイズを627.3KiB削減します(74%削減)。
Losslessly compressing http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg could save 594.3KiB (92% reduction).
Losslessly compressing http://www.kenyabuzz.com/media/uploads/clients/new_tribe_2.jpg could save 25KiB (44% reduction).
Losslessly compressing http://www.kenyabuzz.com/…a/uploads/clients/EthiopianAirlines2.jpg could save 3KiB (22% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/images/Nightlife.Homepage.jpg could save 1.3KiB (2% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/blog.png could save 1.1KiB (43% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/Twitter.png could save 969B (52% reduction).
Losslessly compressing http://www.kenyabuzz.com/…der-Board---Email-Signature--Neutral.jpg could save 920B (2% reduction).
Losslessly compressing http://www.kenyabuzz.com/static/kb/img/social/youtube.png could save 757B (31% reduction).
ロスレス圧縮 http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg 594.3KiB(92%削減)を節約できます。
まず、ログの情報は誤解を招くものです。ロスレスフォーマットを使用して画像を92%圧縮することはできないためです(単色画像、正方形などの基本的な幾何学的形状などの場合を除く)。詳細は this answer および this answer を参照してください。本当に、それらを読んでください、両方とも素晴らしい答えです。
次に、不可逆圧縮形式を使用できます"品質を失うことなく" –違いは非常に微妙であり、人間の目でも気付かれません。
だから、私はあなたがこのリンクから最適化しているウェブサイトから画像をダウンロードしました: http://www.kenyabuzz.com/media/uploads/clients/kenya_buzz_2.jpg
私はPythonコンソールを開いてこれを書きました:
>>> from PIL import Image
>>> # Open the image
>>> im = Image.open("kenya_buzz_2.jpg")
>>> # Now save it
>>> im.save("kenya_buzz_compressed.jpg", format="JPEG", quality=70)
これにより、ディスク上に新しいイメージが作成されました。以下は両方の画像です。
元の(655.3kB)
圧縮(22.4kB〜96%削減@ quality = 70)
quality
オプションで遊ぶことができます。同様に、80
の値を指定すると、画像の品質は向上しますが、サイズが少し大きくなります。
これはかなり人気のある質問なので、Djangoで画像を圧縮するサンプルコードを追加することにしました。
このコードはDjango> = 1.7で機能します。
from io import BytesIO
from PIL import Image
from Django.core.files import File
def compress(image):
im = Image.open(image)
# create a BytesIO object
im_io = BytesIO()
# save image to BytesIO object
im.save(im_io, 'JPEG', quality=70)
# create a Django-friendly Files object
new_image = File(im_io, name=image.name)
return new_image
そして、これは上記のcompress
関数をDjangoモデル(またはどこでも)モデルで使用する方法です。
# models.py
class MyModel(...):
image = models.ImageField(...)
def save(self, *args, **kwargs):
# call the compress function
new_image = compress(self.image)
# set self.image to new_image
self.image = new_image
# save
super().save(*args, **kwargs)
それは基本的にそれです。これはかなり基本的なコードです。モデルが保存されるたびではなく、画像が変更されたときにのみ画像を圧縮することにより、コードを改善できます。
Django Easy Thumbnails app を試してみてください。アップロードされた画像を最適化するためにpostprocessingを追加するオプションがいくつかあります: PostProcessorのドキュメント
いくつかのプロジェクトで本番環境で使用しています。それはうまく機能し、画像サイズは明らかに小さく、ページの読み込みははるかに速く )。
私はそれについての経験はありませんが、 picopt
は包括的に見えます。最適化を実行するために外部ツールに大きく依存しているため、制約されたサーバー環境またはホストされたサーバー環境でのセットアップが難しい場合があります。
それ以外は、「python画像最適化」をググってみてください。 PILベースのソリューションが可能である可能性があることを示唆する他のリンクがいくつかあります。次に例を示します。