2012-12-02 14 views
14

Belge profilinin neden bir ürün üzerinde değiştirildiğini, ölçeklendirilip PIL ile kaydedilemediğini anlayamıyorum. Renk profili olarak sRGB olan ve etiketsiz RGB'yi içeren bir görüntüyle test ettiniz. Python PIL - kırpma sırasında etiketlenmemiş RGB'ye renk profilini değiştirme, ölçeklendirme ve kaydetme

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 

Ben PIL orijinal görüntü olduğu aynı renk profiliyle ölçekli sürümünü kaydetmek için almaya çalışıyorum.

DÜZENLEME: Buna göre o http://comments.gmane.org/gmane.comp.python.image/3215 mümkün olmalı, ama yine de PIL 1.1.7

+0

Bağlantılı tartışmanın ilk yanıtında belirtilen yamaya baktınız mı? Renk profili korumasının çalışması için gereklidir, sadece PIL sürümünün güncellenmesi yeterli değildir (aşağıdaki cevabımda 1.1.7'yi kullanmıştım ve aynı sorunu vardı). – mgibsonbr

+1

@mgibsonbr Gördüğüm gibi Florian Hoech tarafından yapılan hackte Readme dosyasına göre başka bir kütüphaneye ihtiyaç yoktur. Ve 1.1.7'de, hack, http://hg.effbot.org/pil-117/commits/03e996c3b271fd3dabb008a8c694b82e3e6c5917 – Christoffer

cevap

14

PIL icc_profile dosyasını ve icc_profile ile kaydetmenin bir yolunu okuma işlevine sahiptir.

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

Ve kaydetmek tekrar dosyaya ekleyin::

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

Ve tam kod:

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 
Yani ne yaptığını icc_profile almak için dosyayı açmak için oldu

Her iki etiketli (icc profili ile) ve etiketsiz jpeg görüntüleri ile test ettim.

6

Güncelleme kullanarak benim için çalışmıyor: Disregard Bu yanıt, @Christoffer's answer doğru olandır. Sonuç olarak, load dönüşüm sağlamadı, ICC profili başka bir yerde kaydedildi.


Ben bu operasyonların ya renk profilini değişiyor sanmıyorum ama dönüşüm sağ load üzerine yapılıyor. (Windows XP üzerinde 1.1.7) PIL bir yeni bir sürümünü kullanıyor this sample image açtıktan sonra, derhal RGB dönüştürülür:

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

I (bir şey değiştirmeden) o şekilde geri kaydetmeye çalışırsanız, bazı kalite kaybolur. Ben otoh kayıpsız biçimi kullanıyorsanız, elde edilen görüntü bana iyi göründü:

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

işe yaramadı geri sRGB'ye çıkan görüntü dönüştürmek için çalışılıyor:

>>> 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 

Ben sRGB'de tasarrufu inanıyoruz olur pyCMS veya LittleCMS gibi bir dış kütüphaneye gereksinim duyarsınız. Onları kendim denemedim, ama umut verici görünen bir tutorial (ikinci aracı kullanarak). Son olarak, karşı karşıya olduğunuz aynı sorun hakkında bir discussion thread (yükleme/kaydetme sırasında renk profilini koruyarak), umarım size daha fazla işaretçi verebilir.

+0

'a göre bir özelliğe dönüştürülmüş olmalıdır. Renk profili sunucuya ulaştığında görüntüde değiştirilir. Seni doğru anladığım takdirde yükte değil. Ama sonra im = PIL olmalıdır.Kodumda renk profilinin değiştiğini (görüntü) açın. – Christoffer

+0

@Christoffer Açtıktan hemen sonra 'im' modunu yazdırdınız/günlüğe kaydettiniz mi? Testlerimde (bkz. Birinci snippet), hemen "RGB" ye dönüşür, bu yüzden hala yükte olduğunu düşünüyorum. BTW, kodunuza daha yakından baktıktan sonra, ilk önce 'imi 'değişkenini yaratan' image''i açarsınız, fakat daha sonra 'im' imgesini kendiliğinden açar (' im '). Bu doğru mu? – mgibsonbr

+1

sRGB'nin kendi içinde bir mod olduğunu düşünmeyin, ancak RGB modunun sadece bir sürümü. Eğer renk profilini kontrol etmeniz gerekiyorsa, im.info.get ("icc_profile") dosyasını kaydetmeniz gerekir. Haklısın, ilk imi atıyorum. Başka birinin kodunu düzelttiğim için neden orada olduğundan emin değilim. Ama bulduğum çözümde gördüğüm gibi şimdi kullanıyorum;) – Christoffer