5

ファイル サイズを最小化するために、透明な背景と 2 つのインデックス付きの色 (赤と青) のみで画像を作成するにはどうすればよいでしょうか?

より具体的には、変換したい 2 つの白黒画像があり、1 つは透明で青に、もう 1 つは透明と赤に変換します。次に、これら2つの画像をマージしたいと思います。通常の RGBA 画像でそれを行うこともできますが、ファイル サイズを最小限に抑えるために色にインデックスを付けたいと思っています。

理想的には PIL を使用しますが、他の Python ライブラリも機能する可能性があります。

4

2 に答える 2

7

それで、「パレット」画像タイプを使用してなんとかそれを実行しましたが、結果のファイルは期待したほど小さくありません...他の人に役立つ場合、または誰かがそれを改善できる場合に備えて、私のコードを次に示します。

from PIL import Image

im = Image.open("image1.png")
imP = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=3)
imP.putpalette([
    0, 0, 0, # index 0 is black background
    0, 0, 255, # index 1 is blue
    255, 0, 0, # index 2 is red ])

im2 = Image.open("image2.png")
imP2L = im2.convert('L') # need a greyscale image to create a mask
mask = Image.eval(imP2L, lambda a: 255 if a == 0 else 0)
imP.paste(2, mask) # Paste the color of index 2 using image2 as a mask
imP.save('out3.png', transparency = 0, optimize = 1) # Save and set index 0 as transparent
于 2011-10-12T07:06:05.640 に答える
1

2 つの画像を結合すると、2 つの色はなくなります。色は、すべてのピクセル位置でそれぞれの透明度に基づいて結合されます。最悪の場合、256*256=65536 色になり、インデックスを作成できず、圧縮してもうまく圧縮されません。

PNG として保存し、可逆圧縮を最大限に活用することをお勧めします。

于 2011-10-11T22:58:07.643 に答える