12

JPG が Adob​​eRGB であるかどうか、および python で sRGB JPG に変換されているかどうかを検出するにはどうすればよいですか。

それが PIL で可能であれば、それは素晴らしいことです。ありがとうございました。

4

3 に答える 3

7

私は同じ問題を抱えていました.すべての答えをテストし、最終的な画像で間違った色を取得しました. @DrMeers私が試したすべてのマトリックスは、赤と黒で間違った結果をもたらしたので、ここに私の解決策があります:

私が見つけた唯一の方法は、画像からプロファイルを読み取り、ImageCms を使用して変換することです。

from PIL import Image
from PIL import ImageCms
import tempfile

def is_adobe_rgb(img):
    return 'Adobe RGB' in img.info.get('icc_profile', '')
def adobe_to_srgb(img):
    icc = tempfile.mkstemp(suffix='.icc')[1]
    with open(icc, 'w') as f:
        f.write(img.info.get('icc_profile'))
    srgb = ImageCms.createProfile('sRGB')
    img = ImageCms.profileToProfile(img, icc, srgb)
    return img

img = Image.open('testimage.jpg')
if is_adobe_rgb(img):
    img =  adobe_to_srgb(img)
# then do all u want with image. crop, rotate, save etc.

この方法はどのカラープロファイルにも使用できると思いますが、テストされていません。

于 2017-01-07T17:10:12.447 に答える
6

仕様リンク martineau のおかげで、私はいくつかの作業コードを .NET 内の Adob​​e RGB ICC プロファイルの存在を検出し、色空間を sRGB に変換するPIL関数と共にまとめました。Image

adobe_to_xyz = (
    0.57667, 0.18556, 0.18823, 0,
    0.29734, 0.62736, 0.07529, 0,
    0.02703, 0.07069, 0.99134, 0,
) # http://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf                                

xyz_to_srgb = (
    3.2406, -1.5372, -0.4986, 0,
    -0.9689, 1.8758, 0.0415, 0,
    0.0557, -0.2040, 1.0570, 0,
) # http://en.wikipedia.org/wiki/SRGB                                                     

def adobe_to_srgb(image):
    return image.convert('RGB', adobe_to_xyz).convert('RGB', xyz_to_srgb)

def is_adobe_rgb(image):
    return 'Adobe RGB' in image.info.get('icc_profile', '')

# alternative solution if happy to retain profile dependency:                             
# http://stackoverflow.com/a/14537273/284164                                              
# icc_profile = image.info.get("icc_profile")                                             
# image.save(destination, "JPEG", icc_profile=icc_profile)

(これらを使用して、Djangoの 簡単なサムネイルプロセッサ関数を作成しました):

def preserve_adobe_rgb(image, **kwargs):
    if is_adobe_rgb(image):
        return adobe_to_srgb(image)
    return image
于 2013-09-04T10:52:04.417 に答える
5

これを自分でプログラムするには、AdobeRGB 色空間のピクセルを CIE XYZ に変換してから、それを sRGB に変換します。PILimageオブジェクトにはconvert()、画像内のすべてのピクセルに一般的な行列変換を適用する機能を持つという名前のメソッドがあります ( Image.convert()PIL Image モジュールのオンライン ドキュメントのセクションを参照してください。 RGB から XYZ)。

AdobeRGB1998 .pdf仕様のセクション 4.3.4 には、 XYZ を RGB に変換するためのマトリックスが示されています。

JPG 画像の色空間を検出する方法がわかりません。ICC xml プロファイルがファイルの最後に添付されていること (および複数ある場合に発生する問題) について読んだことを思い出しますが、その有効性を保証することはできません。JPEG ファイル形式に関するウィキペディアの記事には、プロファイルが埋め込まれていると書かれています。

于 2012-06-15T04:22:34.657 に答える