Şeffaf bir png resmim var "foo.png" ve başka bir resim açtım
im = Image.open("foo2.png");
Şimdi ihtiyacım olan şey foo.png'yi foo2.png ile birleştirmek.
(foo.png bazı metinler içerir ve bu metni foo2.png dosyasına yazdırmak istiyorum)
Şeffaf bir png resmim var "foo.png" ve başka bir resim açtım
im = Image.open("foo2.png");
Şimdi ihtiyacım olan şey foo.png'yi foo2.png ile birleştirmek.
(foo.png bazı metinler içerir ve bu metni foo2.png dosyasına yazdırmak istiyorum)
Yanıtlar:
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
İlk parametre .paste()
yapıştırılacak görüntüdür. İkincisi koordinatlar ve gizli sos üçüncü parametredir. Görüntüyü yapıştırmak için kullanılacak bir maskeyi gösterir . Saydamlığı olan bir görüntü iletirseniz, alfa kanalı maske olarak kullanılır.
Dokümanları kontrol edin .
foreground.convert('RGBA')
için mask parametresini kullanın .
ValueError: bad transparency mask
ValueError: bad transparency mask
Kullanımı düzeltmek içinbg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
arka plan resmi saydamlık içerdiğinde beklendiği gibi çalışmaz. Gerçek Alpha Compositing kullanmanız gerekir .
Pillow 2.0 alpha_composite
bunu yapan bir işlev içerir .
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
EDIT: Her iki görüntünün RGBA türünde olması gerekir. Bu yüzden convert('RGBA')
paletlendiyse çağırmanız gerekir , vb. Arka planda alfa kanalı yoksa, normal yapıştırma yöntemini kullanabilirsiniz (bu daha hızlı olmalıdır).
ValueError: image has wrong made
hem de @DenizOzger
Gibi OLT önce de işaret Image.paste
düzgün çalışmıyor, ne zaman, kaynak ve hedef hem alfa içerir.
Aşağıdaki senaryoyu düşünün:
Her ikisi de alfa içeren iki test görüntüsü:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Aşağıdaki Image.paste
gibi kullanarak görüntü birleştirme :
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
aşağıdaki görüntüyü üretir (üst üste bindirilmiş kırmızı piksellerin alfa kısmı tamamen 2. katmandan alınır. Pikseller doğru şekilde karıştırılmamış):
Aşağıdaki Image.alpha_composite
gibi kullanarak görüntü birleştirme :
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
aşağıdaki (doğru) görüntüyü üretir:
alpha_composite
ofseti ayarlayamazsınız, paste
işlevi tamamen değiştirmek için bir örnek vermek ister misiniz ?
Karışım da kullanılabilir:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
def trans_paste(bg_img,fg_img,box=(0,0)):
fg_img_trans = Image.new("RGBA",bg_img.size)
fg_img_trans.paste(fg_img,box,mask=fg_img)
new_img = Image.alpha_composite(bg_img,fg_img_trans)
return new_img
Benzer bir soru vardı ve bir cevap bulmakta zorluk çekti. Aşağıdaki işlev, saydamlık parametresine sahip bir görüntüyü belirli bir ofsetteki başka bir görüntüye yapıştırmanıza olanak tanır.
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
Kendim üzerinde çalıştığım bir projede @Melch kullanıcısı tarafından yapılan ve @ Mitril tarafından önerilen bu yorumun önerisini kendim kodladım.
Ben de sınır güvenliğini kodladım, işte kodu . (Belirli bir taahhüdü bağladım çünkü bu deponun geleceğinde işler değişebilir)
Not: np.array(Image.open(...))
A ve B girişleri copy_from
ve bu bağlantılı işlev overlay
argümanları gibi resimlerden numpy diziler bekliyorum .
Bağımlılıklar, copy_from
dilimin hemen önündeki fonksiyon, yöntem ve dilimleme için PIL Resim içeriği olarak numpy dizileridir.
Dosya çok sınıfa yönelik olsa da, bu işlevi kullanmak istiyorsanız , arka plan resmi numpy dizinizi overlay_transparent
yeniden adlandırdığınızdan emin olun self.frame
.
Veya tüm dosyayı kopyalayabilir (muhtemelen bazı içe aktarmaları ve Utils
sınıfı kaldırabilirsiniz ) ve bu Frame sınıfıyla şu şekilde etkileşim kurabilirsiniz:
# 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)
Daha sonra background.frame
üst üste bindirilmiş ve alfa birleştirilmiş diziniz var, ondan bir PIL görüntüsü overlayed = Image.fromarray(background.frame)
veya benzeri bir şey alabilirsiniz:
overlayed = Frame()
overlayed.load_from_array(background.frame)
Ya da background.save("save path")
doğrudan alfa bileşimli dahili self.frame
değişkenden aldığı gibi.
Dosyayı okumak ve yöntemler gibi kodlu bu uygulama I başka güzel işlevlerini bulabilirsiniz get_rgb_frame_array
, resize_by_ratio
, resize_to_resolution
, rotate
, gaussian_blur
, transparency
, vignetting
:)
Muhtemelen resolve_pending
yöntemi o projeye özgü olarak kaldırmak istersiniz .
Size yardımcı olduysam sevindim, bahsettiğim projenin repo'suna baktığınızdan emin olun , bu soru ve konu geliştirme konusunda bana çok yardımcı oldu :)
;