回答:
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
最初のパラメータ.paste()
は、貼り付ける画像です。2番目は座標で、秘密のソースは3番目のパラメーターです。画像の貼り付けに使用されるマスクを示します。透明度のある画像を渡すと、アルファチャネルがマスクとして使用されます。
ドキュメントを確認してください。
foreground.convert('RGBA')
は、マスクパラメータに使用します。
ValueError: bad transparency mask
ValueError: bad transparency mask
使用を修正するにはbg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
背景画像にも透明度が含まれていると、期待どおりに動作しません。実際のアルファ合成を使用する必要があります。
Pillow 2.0には、alpha_composite
これを行う関数が含まれています。
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
編集:どちらの画像もRGBAタイプである必要があります。したがってconvert('RGBA')
、それらがパレット化されているかどうかなどを呼び出す必要があります。背景にアルファチャネルがない場合は、通常の貼り付け方法を使用できます(これは高速です)。
ValueError: image has wrong made
にも@DenizOzger
OLTすでに指摘し、Image.paste
正常に動作しない、ときに、ソースと宛先の両方のアルファが含まれています。
次のシナリオを検討してください。
2つのテスト画像、どちらもアルファを含む:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Image.paste
同様に使用して画像を合成する:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
次の画像を生成します(オーバーレイされた赤いピクセルのアルファ部分は、第2レイヤーから完全に取得されます。ピクセルは正しくブレンドされていません)。
Image.alpha_composite
同様に使用して画像を合成する:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
次の(正しい)画像が生成されます。
alpha_composite
、オフセットを設定できませんpaste
。関数を完全に置き換える例を挙げていただけませんか?
ブレンドを使用することもできます:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
同様の質問があり、答えを見つけるのが困難でした。次の関数を使用すると、特定のオフセットで別の画像の上に透明度パラメーターを使用して画像を貼り付けることができます。
import Image
def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)):
fg_img_trans = Image.new("RGBA",fg_img.size)
fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha)
bg_img.paste(fg_img_trans,box,fg_img_trans)
return bg_img
bg_img = Image.open("bg.png")
fg_img = Image.open("fg.png")
p = trans_paste(fg_img,bg_img,.7,(250,100))
p.show()
ValueError: images do not match
結局、ユーザー@ P.Melchによるこのコメントの提案と、自分が取り組んでいるプロジェクトに関する@Mithril の提案を自分でコーディングすることになりました。
私も範囲外の安全性をコーディングしました、これはそのためのコードです。(このリポジトリの将来は状況が変わる可能性があるため、特定のコミットをリンクしました)
注:np.array(Image.open(...))
入力からの入力AとB、copy_from
およびこのリンクされた関数のoverlay
引数と同様に、画像からのnumpy配列を期待しています。
依存関係は、その直前の関数、copy_from
メソッド、およびスライス用のPILイメージコンテンツとしてのnumpy配列です。
ファイルは非常にクラス指向ですが、その関数を使用する場合はoverlay_transparent
、必ず名前self.frame
をバックグラウンドイメージのnumpy配列に変更してください。
または、ファイル全体をコピーして(おそらく一部のインポートとUtils
クラスを削除して)、次のようにこのFrameクラスを操作することもできます。
# Assuming you named the file frame.py in the same directory
from frame import Frame
background = Frame()
overlay = Frame()
background.load_from_path("your path here")
overlay.load_from_path("your path here")
background.overlay_transparent(overlay.frame, x=300, y=200)
次にbackground.frame
、オーバーレイされたアルファ合成配列として、overlayed = Image.fromarray(background.frame)
次のようなものでPIL画像を取得できます。
overlayed = Frame()
overlayed.load_from_array(background.frame)
またはbackground.save("save path")
、アルファ合成された内部self.frame
変数から直接取得します。
あなたはファイルを読み込み、メソッドのようにコード化されたこの実装Iと他のいくつかの素敵な機能を見つけることができますget_rgb_frame_array
、resize_by_ratio
、resize_to_resolution
、rotate
、gaussian_blur
、transparency
、vignetting
:)
resolve_pending
それはそのプロジェクトに固有であるため、おそらくメソッドを削除する必要があります。
私があなたを助けてくれてうれしいです、私が話しているプロジェクトのレポを必ずチェックしてください、この質問とスレッドは開発でたくさん助けてくれました:)
;
Pythonでコマンドの最後に使用しないでください:醜い...