透明な画像を拡大縮小したいが、後で合成する背景の色がまだわからないとします。残念ながら、PIL は完全に透明なピクセルの色の値を組み込んでいるようで、悪い結果につながります。完全に透明なピクセルを無視するように PIL サイズ変更を指示する方法はありますか?
import PIL.Image
filename = "trans.png" # http://qrc-designer.com/stuff/trans.png
size = (25,25)
im = PIL.Image.open(filename)
print im.mode # RGBA
im = im.resize(size, PIL.Image.LINEAR) # the same with CUBIC, ANTIALIAS, transform
# im.show() # does not use alpha
im.save("resizelinear_"+filename)
# PIL scaled image has dark border
(0,0,0,0) (黒だが完全に透明) の背景を持つ元の画像 (左)
黒い光輪のある出力画像 (中央)
gimpでスケーリングされた適切な出力(右)
編集:私が探しているものを達成するには、サイズ変更関数自体のサンプリングを変更して、完全に透明なピクセルを無視するようにする必要があります。
edit2:非常に醜い解決策を見つけました。完全に透明なピクセルの色の値を周囲の完全に透明でないピクセルの平均値に設定して、サイズ変更中の完全に透明なピクセルの色の影響を最小限に抑えます。単純な形では遅いですが、他に解決策がなければ投稿します。膨張操作を使用して必要なピクセルのみを処理することで、高速化できる可能性があります。
edit3:事前に乗算されたアルファが最適です-マークの回答を参照してください