2010-11-18 12 views
4

olarak ayarlanmıştır. Tamamen saydam bir arka plan üzerinde soluklaşan siyah bir damlalıklı kırmızı bir daire düşünün. Görüntüyü PIL ile açıp tekrar açtığımda, arka plan tamamen şeffaf kalıyor, ancak dropshadow tam siyah oluyor.Python PIL - Opaklık> 0 olan tüm PNG alanlarının opaklıkları 1

sorun bile görüntüyü değiştirmeden görünür:

image = Image.open('input.png') 
image = image.convert('RGBA') 
image.save('output.png') 

ben kırpmak veya yeniden boyutlandırmak, böylece tam olarak özgün görünümlü görüntü tutmak istiyorum.

DÜZENLEME: İşte efekti gösteren bir PNG. PNGNQ kullanılarak 8 bit'e dönüştürüldü. Yukarıdaki Python kodunu kullanırken

alt text

aşağıdaki gibi gelir:

alt text

+0

@Kyle:

bir yama salt okunur destek için burada bulunmaktadır yayınladığınız ediyorum 'input.png' ve 'output.png'? Sorunu yeniden üretemiyorum. – unutbu

+0

Dosyayı hassas malzemelerin "düzeltilmesi" için düzenledim ve yeniden oluşturulan görüntü iyi çalıştı. Bu yüzden, input.png'nin 8 bitlik bir PNG olduğunu anladım ve bence web grafikleri dışında oldukça nadir olduklarını göz önünde bulundurarak bunları hesaba katmak için çok fazla çaba harcadım. –

+0

'.png' biçiminin hangi lezzeti' input.png' - başlangıçta hangi biçimdir? – martineau

cevap

6

PIL şu anda PNG8 için tam alfa desteklemiyor gibi görünüyor. Yaramaz hissediyorsanız http://mail.python.org/pipermail/image-sig/2010-October/006533.html

, sen monkeypatch olabilir PIL:

from PIL import Image, ImageFile, PngImagePlugin 

def patched_chunk_tRNS(self, pos, len): 
    i16 = PngImagePlugin.i16 
    s = ImageFile._safe_read(self.fp, len) 
    if self.im_mode == "P": 
     self.im_info["transparency"] = map(ord, s) 
    elif self.im_mode == "L": 
     self.im_info["transparency"] = i16(s) 
    elif self.im_mode == "RGB": 
     self.im_info["transparency"] = i16(s), i16(s[2:]), i16(s[4:]) 
    return s 
PngImagePlugin.PngStream.chunk_tRNS = patched_chunk_tRNS 

def patched_load(self): 
    if self.im and self.palette and self.palette.dirty: 
     apply(self.im.putpalette, self.palette.getdata()) 
     self.palette.dirty = 0 
     self.palette.rawmode = None 
     try: 
      trans = self.info["transparency"] 
     except KeyError: 
      self.palette.mode = "RGB" 
     else: 
      try: 
       for i, a in enumerate(trans): 
        self.im.putpalettealpha(i, a) 
      except TypeError: 
       self.im.putpalettealpha(trans, 0) 
      self.palette.mode = "RGBA" 
    if self.im: 
     return self.im.pixel_access(self.readonly) 
Image.Image.load = patched_load 

Image.open('kHrY6.png').convert('RGBA').save('kHrY6-out.png') 
+0

Bir çekicilik gibi çalışır! Teşekkürler! –

0

Sorun biraz çözüldüğünü düşünüyorum, ama sizi ayarlamanız gerekir mümkündür alfa kanalı derinliği?