5

この方法を使用して、png画像のサイズを変更します。

PNGを事前に乗算されたアルファに変換する方法

しかし、この画像はまだ透明度を失っています。

import Image, numpy

def resize(filename, img,height, width):
    if filename.endswith(".png"):
        img = img.convert('RGBA')
        premult = numpy.fromstring(img.tostring(), dtype=numpy.uint8)
        alphaLayer = premult[3::4] / 255.0
        premult[::4] *= alphaLayer
        premult[1::4] *= alphaLayer
        premult[2::4] *= alphaLayer
        img = Image.fromstring("RGBA", img.size, premult.tostring())
    img = img.resize((height,width), Image.ANTIALIAS)
    return img

から

http://i.stack.imgur.com/oPV5q.pnghttp://i.stack.imgur.com/jzmT9.png

4

3 に答える 3

3

この問題はリンクされた質問とは関係ありません。代わりに、tRNSPNG チャンクを正しく読み取るように PIL にパッチを適用する必要があります。PIL は、このチャンクに 1 つの値を想定していますが、表示されているこの画像には、パレット内の各値の透明度の説明があります。それが処理された後、問題を解決するのは簡単です: 画像を'LA'モードに変換してサイズを変更します:

import sys
from PIL import Image

img = Image.open(sys.argv[1])
pal = img.getpalette()
width, height = img.size
actual_transp = img.info['actual_transparency'] # XXX This will fail.

result = Image.new('LA', img.size)

im = img.load()
res = result.load()
for x in range(width):
    for y in range(height):
        t = actual_transp[im[x, y]]
        color = pal[im[x, y]]
        res[x, y] = (color, t)

result.resize((64, 64), Image.ANTIALIAS).save(sys.argv[2])

だから、これから、これに行きここに画像の説明を入力ます:ここに画像の説明を入力

この特定の状況に対する PIL パッチは、実際には非常に単純です。を開きPIL/PngImagePlugin.py、関数に移動し、をチェックするステートメントとそれに続く をチェックするステートメントをchunk_tRNS入力し、次の行を追加します。ifim_mode == "P"i >= 0self.im_info["actual_transparency"] = map(ord, s)

于 2013-01-31T22:45:37.893 に答える
1

この問題は修正されました。mmgp のナイス ハックは不要になりました。PIL は透明度を適切に読み取って適用するようになりました。

https://github.com/d-schmidt/Pillow/commit/5baa1ac1b8d41fcedce7b12ed1c4a8e87b4851bc

于 2013-02-01T19:24:38.713 に答える