web-dev-qa-db-ja.com

Pythonで書き込み/読み取りなしでJPEG圧縮を実行する方法

圧縮されたJPEG画像を直接操作したいのですが。 PIL/Pillowを使用すると、保存時に画像を圧縮し、圧縮した画像を読み戻すことができます。

from PIL import Image
im1 = Image.open(IMAGE_FILE)
IMAGE_10 = os.path.join('./images/dog10.jpeg')
im1.save(IMAGE_10,"JPEG", quality=10)
im10 = Image.open(IMAGE_10)

しかし、私は無関係な書き込みと読み取りなしでこれを行う方法が欲しいです。 Python画像と品質番号を入力として受け取り、指定された品質のその画像のjpegバージョンを返す関数を含むパッケージはありますか?

13
user1245262

インメモリのファイルのようなものについては、StringIOを使用できます。見てください:

from io import StringIO # "import StringIO" directly in python2
from PIL import Image
im1 = Image.open(IMAGE_FILE)

# here, we create an empty string buffer    
buffer = StringIO.StringIO()
im1.save(buffer, "JPEG", quality=10)

# ... do something else ...

# write the buffer to a file to make sure it worked
with open("./photo-quality10.jpg", "w") as handle:
    handle.write(buffer.contents())

photo-quality10.jpgファイルを確認すると、同じ画像である必要がありますが、JPEG圧縮設定の品質は10%です。

14
sgammon

BytesIOの使用

try:
    from cStringIO import StringIO as BytesIO
except ImportError:
    from io import BytesIO

def generate(self, image, format='jpeg'):
    im = self.generate_image(image)
    out = BytesIO()
    im.save(out, format=format,quality=75)
    out.seek(0)
    return out

Python3.0にはStringIOがありません。次を参照してください: StringIO in python

5
Super Engine