18

ドキュメントプロファイルがPILで切り抜き、拡大縮小、保存で変更されている理由を理解できません。カラープロファイルとしてsRGBを使用し、RGBのタグを付けていない画像でテストしました。

def scale(self, image):
    images = []

    image.seek(0)

    try:
        im = PIL.open(image)
    except IOError, e:
        logger.error(unicode(e), exc_info=True)

    images.append({"file": image, "url": self.url, "size": "original"})

    for size in IMAGE_WEB_SIZES:
        d = cStringIO.StringIO()
        try:
            im = crop(image, size["width"], size["height"])
            im.save(d, "JPEG")
            images.append({"file": d, "url": self.scale_url(size["name"]), "size": size})
        except IOError, e:
            logger.error(unicode(e), exc_info=True)
            pass

    return images

元の画像と同じカラープロファイルでスケーリングされたバージョンを保存するようにPILを取得しようとしています。

編集:これによると、 http://comments.gmane.org/gmane.comp.python.image/3215可能であるはずですが、PIL1.1.7を使用しても機能しません。

4

2 に答える 2

23

PILには、icc_profileを読み取る機能と、icc_profileで保存する方法があります。だから私がしたことは、icc_profileを取得するためにファイルを開くことでした:

try:
    im1 = PIL.open(image)
    icc_profile = im1.info.get("icc_profile")

そして、保存時にファイルに再度追加します。

im.save(d, "JPEG", icc_profile=icc_profile)

そして完全なコード:

def scale(self, image):
    images = []

    image.seek(0)

    try:
        im1 = PIL.open(image)
        icc_profile = im1.info.get("icc_profile")
    except IOError, e:
        logger.error(unicode(e), exc_info=True)

    images.append({"file": image, "url": self.url, "size": "original"})

    for size in IMAGE_WEB_SIZES:
        d = cStringIO.StringIO()
        try:
            im = crop(image, size["width"], size["height"])

            im.save(d, "JPEG", icc_profile=icc_profile)
            images.append({"file": d, "url": self.scale_url(size["name"]), "size": size})
        except IOError, e:
            logger.error(unicode(e), exc_info=True)
            pass

    return images

タグ付き(iccプロファイル付き)とタグなしのjpeg画像の両方でテストしました。

于 2013-01-26T13:12:46.743 に答える
6

更新:この答えは無視してください。 @Christofferの答えは正しいものです。結局のところload、変換は行われていませんでした。ICCプロファイルは別の場所に保存されていました。


これらの操作のどちらもカラープロファイルを変更しているとは思いませんが、変換はで正しく行われていloadます。最近のバージョンのPIL(Windows XPでは1.1.7)を使用してこのサンプル画像を開くと、すぐにRGBに変換されます。

>>> from PIL import Image
>>> Image.open('Flower-sRGB.jpg')
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=600x450 at 0xD3D3F0>

(何も変更せずに)元の状態に戻そうとすると、品質がいくらか失われます。ロスレス形式のOTOHを使用すると、結果の画像は見栄えが良くなります。

>>> im = Image.open('Flower-sRGB.jpg')
>>> im.save("Flower-RBG.jpg")
>>> im.save("Flower-RBG.png")

結果の画像をsRGBに変換しようとしても機能しませんでした。

>>> im = Image.open('Flower-sRGB.jpg').convert('CMYK')
>>> im
<PIL.Image.Image image mode=CMYK size=600x450 at 0xD73F08>
>>> im.save("Flower-CMYK.png")

>>> im = Image.open('Flower-sRGB.jpg').convert('sRGB')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 702, in convert
    im = im.convert(mode, dither)
ValueError: conversion from RGB to sRGB not supported

sRGBで保存するには、 pyCMSLittleCMSなどの外部ライブラリが必要になると思います。私はそれらを自分で試したことはありませんが、これは有望に見えるチュートリアル(後者のツールを使用)です。最後に、これがあなたが直面している同じ問題についてのディスカッションスレッドです(ロード/保存時にカラープロファイルをそのまま維持します)、うまくいけば、それはあなたにいくつかのより多くのポインタを与えることができます。

于 2012-12-21T03:09:24.033 に答える