2017-02-28 9 views
10

私はPythonの新機能で、ユーザーがカスタム画像を作成できるようにすることを検討しています。考え方は、クライアントがいくつかのオプションを選択し、サーバー上でイメージを作成してダウンロードする(またはサーバー側で他のものに使用する)というものです。透明度の異なるレイヤーの合成画像を作成する

イメージは多くのイメージで構成されています。イメージの多くは、不規則な形状で透明性のある小さなアイコンタイプのイメージです。すべての層は.pngファイルです。

私は枕を使用しようとしましたが、画像は上部レイヤの透明度を適切に使用するために全体画像と同じサイズである必要があります。

は、ここで私はこれまで試したものです:

from PIL import Image 

background = Image.open("Background.png") 
foreground = Image.open("Trim.png") 
fire = Image.open("Type_Fire_Large.png") 

background = Image.alpha_composite(background, foreground) 
background.paste(fire, (150, 150)) 
background.show() 

画像は、次のようになります

Layered image with black on overlay

Background.pngは影 "ノイズ" であるとTrim.pngはグレーの斜線です。最高の部分:Trim.pngは中央が透明で中央にBackground.pngと表示されます。しかし、それはまた画像と同じ大きさです。

問題はFireです。どのようにその黒い境界線(そして奇妙なフクシアの点)theresを注意してください。ドキュメントには、オーバーレイイメージが同じサイズである必要があることが記載されています。しかし、誰かが別の画像の上に透明な小さなアイコンを配置し、それらを1つの画像に合成したいという一般的なシナリオのようです。

私は特定のライブラリには付いていませんが、私はアイデアや代替案を広く公開しています。私がやろうとしているのは、シンプルなので、画像を生成するためにゲームエンジン全体を作成することは、おそらく多すぎるでしょう。ちょうど別の上に1つのPNGを貼り付け

答えて

4

は、透明性を尊重し、

background.paste(fire, (x,y), fire.convert("RGBA")) 
+0

これは驚くほど簡単で、文書化されていません。ありがとうございました! – Chris

+0

奇数のfusciaドットは、PNGがすでにRGBAモードであったことを意味しますが、これをどのように把握しましたか? –

+0

@ MarkRansomアルファチャンネルのあるPngでImage.open()を実行したところ、マスクとして使用するにはRGBA変換がまだ必要であることに気付きました。 –

2

ファーストを試してみてください私はヨハネスHolmbergのは、すでにあなたの主な関心事に答え言うと思います:行方不明の透明性を。

しかし、私はうまくいけば、それはその奇数フクシアドットとのことだかを説明することができます(Alphaための赤、緑、青のRGBおよびA)透明色の画像は、通常はRGBAとして格納され

。ここでは、Alphaは、透明度がないことから完全な透明度までの透明度を定義します。

GIMPロゴが正しく表示されるようにイメージを重ねて表示しますが、カラーストライプはほぼ透明ですのでほとんど見えません。

Using RGBA

しかし - すべてのピクセルとして可能性が見えるかもしれない - すべてのピクセルは、まだ色を持っていません。 100%の透明度を持つピクセルでもしたがって、Alphaを考慮しなければ、各ピクセルの色は透明ではありません。このようにして、完全に透明である限り、通常は全く邪魔にならない色を乱すことがあります。

enter image description here

+0

ドットはDuke Nukem 3Dを使いこなし、2dスプライトで除去される色としてフクシアを使用した時代を思い出させました。たとえ透明であっても色があることは意味があります。私はドットがセーブの一部であったと思っています。明確化のおかげで、今私は知っている! – Chris

関連する問題