2010-11-18 4 views
4

완전히 투명한 배경 위에 검은 색 그림자가 사라지는 빨간색 원을 상상해보십시오. PIL로 이미지를 열고 다시 저장할 때 배경은 완전히 투명하지만 드롭 섀도우는 완전히 검은 색이됩니다.Python PIL - 불투명도가 0보다 큰 PNG 영역은 불투명도가 1로 설정됩니다.

문제는 심지어 이미지를 변경하지 않고 나타납니다

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

은 내가 자르거나 크기를 조정할 수 있도록 원래대로 정확하게 찾고 이미지를 유지하려는.

편집 : 여기에 효과를 나타내는 PNG가 있습니다. PNGNQ를 사용하여 8 비트로 변환되었습니다. 위의 파이썬 코드를 사용하는 경우

alt text

는 다음과 같이 나온다 :

alt text

+0

@Kyle :

패치가 읽기 전용 지원을 위해 여기에 있습니다 당신은 게시 할 것'input.png' 및 'output.png'? 문제를 재현 할 수없는 것 같습니다. – unutbu

+0

파일을 편집하여 민감한 내용을 "수정"하고 다시 저장된 이미지가 정상적으로 작동합니다. 그래서 나는 input.png이 8 비트 PNG이고, 웹 그래픽 외부에서는 매우 드물다는 것을 고려하여 너무 많은 노력을 고려해야한다고 생각합니다. –

+0

'.png' 형식의 맛은'input.png'입니다 - 어떤 형식으로 시작해야할까요? – martineau

답변

6

PIL은 현재 PNG8의 전체 알파를 지원하지 않는 것 같습니다. 당신이 나쁜 느낌이있어 경우 http://mail.python.org/pipermail/image-sig/2010-October/006533.html

, 당신은 monkeypatch 수 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

그것은 매력처럼 작동합니다! 감사! –

0

내가 문제가 어느 정도 해결되었다고 생각하지만, 그것은 당신이 설정해야 할 가능성이있다 알파 채널의 깊이?

관련 문제