2010-11-18 27 views
4

完全に透明な背景の上に消える黒のドロップシャドウを持つ赤い円を想像してください。 PILで画像を開いて保存すると、背景は完全に透明ですが、ドロップシャドウは完全に黒くなります。Python PIL - 不透明度> 0のPNGのすべての領域は、不透明度が1に設定されています

問題でも画像を変更せずに表示されます。

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

私はそれをトリミングやサイズを変更できるように、正確に元のように見ている画像を保存しておきたいです。

EDIT:ここに効果を示すPNGがあります。 PNGNQを使用して8ビットに変換されました。

alt text

次のようにそれが出てくる上のPythonコードを使用する場合:

alt text

+0

@Kyle:あなたは 'input.png'を投稿するだろうし、 'output.png'?私は問題を再現していないようです。 – unutbu

+0

私は敏感なものを "redact"するためにファイルを編集し、再保存されたイメージはうまくいきました。だから私はinput.pngが8ビットのPNGであることに気がつきました。そして、私はそれがWebグラフィックスの外ではまれであると考えて、それを考慮に入れるのは多すぎると思う。 –

+0

'.png'形式の風味は' input.png'です - それはどの形式ですか? – martineau

答えて

6

現在、PILはPNG8のフルアルファをサポートしていないようです。

読み取り専用のサポートのためにここにパッチがあります:http://mail.python.org/pipermail/image-sig/2010-October/006533.html

あなたがいたずらを感じているならば、あなたは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

私は、問題がやや解消されたと思いますが、それはあなたが設定する必要があることも可能ですアルファチャンネルの深さ?

関連する問題