web-dev-qa-db-ja.com

djangoで画像を可逆圧縮

私は最適化を行っており、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).
21
user4910881

ロスレス圧縮 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)

original image


圧縮(22.4kB〜96%削減@ quality = 70)

compressed image using Python


qualityオプションで遊ぶことができます。同様に、80の値を指定すると、画像の品質は向上しますが、サイズが少し大きくなります。


Djangoでの画像の圧縮

これはかなり人気のある質問なので、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)

それは基本的にそれです。これはかなり基本的なコードです。モデルが保存されるたびではなく、画像が変更されたときにのみ画像を圧縮することにより、コードを改善できます。

37
xyres

Django Easy Thumbnails app を試してみてください。アップロードされた画像を最適化するためにpostprocessingを追加するオプションがいくつかあります: PostProcessorのドキュメント

いくつかのプロジェクトで本番環境で使用しています。それはうまく機能し、画像サイズは明らかに小さく、ページの読み込みははるかに速く )。

3

私はそれについての経験はありませんが、 picopt は包括的に見えます。最適化を実行するために外部ツールに大きく依存しているため、制約されたサーバー環境またはホストされたサーバー環境でのセットアップが難しい場合があります。

それ以外は、「python画像最適化」をググってみてください。 PILベースのソリューションが可能である可能性があることを示唆する他のリンクがいくつかあります。次に例を示します。

  1. PILを使用して画像ファイルのサイズを縮小する方法
  2. 画像の最適化(Pythonを使用したGoogle App Engine)
2
mhawke