पीआईएल का उपयोग करके एक पारदर्शी पीएनजी छवि को दूसरी छवि के साथ कैसे मर्ज किया जाए


151

मेरे पास एक पारदर्शी png छवि है "foo.png" और मैंने इसके साथ एक और छवि खोली है

im = Image.open("foo2.png");

अब मुझे foo2.png के साथ foo.png को मर्ज करने की आवश्यकता है।

(foo.png में कुछ पाठ हैं और मैं उस पाठ को foo2.png पर प्रिंट करना चाहता हूं)


71
;अजगर में अपने आदेशों के अंत में उपयोग न करें : यह बदसूरत है ...
nosklo

6
मैं अपने दिमाग में रखूँगा, धन्यवाद !!
एक्रीना

जवाबों:


288
import Image

background = Image.open("test1.png")
foreground = Image.open("test2.png")

background.paste(foreground, (0, 0), foreground)
background.show()

पहला पैरामीटर .paste()पेस्ट करने के लिए छवि है। दूसरा निर्देशांक हैं, और गुप्त सॉस तीसरा पैरामीटर है। यह एक मुखौटा को इंगित करता है जिसका उपयोग छवि को चिपकाने के लिए किया जाएगा। यदि आप एक छवि को पारदर्शिता के साथ पास करते हैं, तो अल्फा चैनल का उपयोग मुखौटा के रूप में किया जाता है।

डॉक्स की जाँच करें ।


6
यह सुनिश्चित करने के लिए कि अग्रभूमि में सभी मामलों में पारदर्शिता है, foreground.convert('RGBA')मास्क पैरामीटर के लिए उपयोग करें ।
रैनसम

2
धन्यवाद। मुझे तीसरा पैरामीटर भी याद आ रहा था।
सिलौने गेरिन

13
मैं हो रहा हूँValueError: bad transparency mask
डेनिज़ ओज़गर

2
गुप्त सॉस स्वादिष्ट था
AFP_555

3
@DenizOzger का ValueError: bad transparency maskउपयोग ठीक करने के लिएbg.paste(fg, (0, 0), fg.convert('RGBA'))
सैमुअल

66

Image.pasteउम्मीद के मुताबिक काम नहीं करता है जब पृष्ठभूमि छवि में पारदर्शिता भी होती है। आपको वास्तविक अल्फा कंपोजिंग का उपयोग करने की आवश्यकता है ।

तकिया 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')यदि वे तालू, आदि हैं। यदि पृष्ठभूमि में एक अल्फा चैनल नहीं है, तो आप नियमित पेस्ट विधि का उपयोग कर सकते हैं (जो तेज होना चाहिए)।


मैंने सिर्फ पीआईएल के साथ, एक और पारदर्शी छवि को ओवरले करने के लिए पेस्ट () का इस्तेमाल किया, और जैसा मैंने उम्मीद की थी, उसने काम किया। किस तरह से यह काम नहीं करता है जैसा कि आपने उम्मीद की थी?
पीटर हेन्सन

3
@PeterHansen, पेस्ट () उम्मीद के मुताबिक काम नहीं करता है "जब पृष्ठभूमि छवि में पारदर्शिता भी होती है"।
होम

1
@PeterHansen उदाहरण है: github.com/python-pillow/Pillow/issues/…
homm

@ माँ धन्यवाद यह बहुत पहले था कि मेरे पास कोई स्मृति नहीं है कि मैंने क्या कोशिश की। ऐसा लगता है कि मैंने पृष्ठभूमि की छवि के बारे में आपके द्वारा उद्धृत भाग को याद किया है जिसमें पारदर्शिता भी है।
पीटर हैनसेन

4
मुझे ValueError: image has wrong made@DenizOzger
digitaldavenyc

48

जैसा कि ओल्ट ने पहले ही बताया, Image.pasteठीक से काम नहीं करता है, जब स्रोत और गंतव्य दोनों में अल्फा होते हैं।

इस परिदृश्य पर विचार करें:

दो परीक्षण चित्र, दोनों में अल्फ़ा हैं:

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

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)

निम्नलिखित (सही) छवि तैयार करता है:

यहाँ छवि विवरण दर्ज करें


1
स्क्रीनशॉट के लिए धन्यवाद! वास्तव में मदद करता है!
वियतनामी

1
लेकिन alpha_compositeऑफसेट सेट नहीं कर सकते, क्या आप pasteफ़ंक्शन को पूरी तरह से बदलने के लिए एक उदाहरण देना चाहेंगे ?
मिथिलाल

3
मुझे लगता है कि आपको गारगेट छवि के समान आकार के साथ एक नई खाली छवि बनानी होगी, परत को उचित स्थिति पर चिपकाना होगा और लक्ष्य छवि पर नई छवि को मिश्रण करने के लिए Alpha_compositing का उपयोग करना होगा।
P.Melch

11

एक सम्मिश्रण का उपयोग भी कर सकता है:

im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")

1
इस एक ने मेरे लिए काम किया। छवियों का आकार बिल्कुल एक जैसा होना चाहिए, लेकिन यह ठीक है। पेस्ट फंक्शन ने इसे मेरे लिए नहीं काटा ...
Liviu Sosu

2
'ValueError: चित्र मेल नहीं खाते'
Schütze

2
संभवतः, वे विभिन्न आयामों के हैं। आपको उनमें से किसी एक को स्केल या क्रॉप करना पड़ सकता है।
nvd

2
@ Schütze nvd की टिप्पणी देखें क्योंकि उसने / उसने (@blahblah का उपयोग करके) पिंग नहीं किया था
MilkyWay90

1
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

2
नमस्ते, क्या आप संभवतः अपने उत्तर में थोड़ा और संदर्भ जोड़ सकते हैं? अन्यथा अनुरोधकर्ता को इसके पीछे "क्यों" सीखने की संभावना नहीं है।
जिम्फ

0

एक समान प्रश्न था और एक उत्तर खोजने में कठिनाई थी। निम्नलिखित फ़ंक्शन आपको एक छवि को एक विशिष्ट ऑफसेट पर एक अन्य छवि पर पारदर्शिता पैरामीटर के साथ पेस्ट करने की अनुमति देता है।

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
lllllllllllll

0

मैंने उपयोगकर्ता @ P.Melch द्वारा की गई इस टिप्‍पणी के सुझाव को स्‍वचालित रूप से समाप्‍त किया और @Mithril ने एक परियोजना पर सुझाव दिया, जिस पर मैं चल रहा हूं।

मैं सीमा सुरक्षा से बाहर भी कोडित हूं, यहां इसके लिए कोड है । (मैंने एक विशिष्ट प्रतिबद्धता को जोड़ा क्योंकि इस भंडार के भविष्य में चीजें बदल सकती हैं)

नोट: मैं उम्मीद करता हूं कि इमेजेज से एग्जिट np.array(Image.open(...))ए और बी जैसे copy_fromऔर इस लिंक्ड फंक्शन overlayआर्गुमेंट्स से सुन्न एरेज हो ।

निर्भरताएं फ़ंक्शन से ठीक पहले होती हैं, copy_fromविधि, और खसखस ​​सरणियों को टुकड़ा करने के लिए पीआईएल छवि सामग्री के रूप में।

हालाँकि फ़ाइल बहुत ही क्लास ओरिएंटेड है, अगर आप उस फ़ंक्शन का उपयोग करना चाहते हैं, तो overlay_transparentनाम बदलना सुनिश्चित करेंself.frame अपनी पृष्ठभूमि की छवि सुन्न करने लिए ।

या आप पूरी फ़ाइल को कॉपी कर सकते हैं (शायद कुछ आयात और Utilsवर्ग को हटा दें ) और इस तरह इस फ़्रेम वर्ग के साथ बातचीत करें:

# 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)हैं:

overlayed = Frame()
overlayed.load_from_array(background.frame)

या बस के background.save("save path")रूप में सीधे अल्फा से लिया जाता है आंतरिक self.frameचर रचना ।

आप फ़ाइल को पढ़ने और इस कार्यान्वयन मैं जैसे तरीकों कोडित के साथ कुछ अन्य अच्छा काम करता है पा सकते हैं get_rgb_frame_array, resize_by_ratio, resize_to_resolution, rotate, gaussian_blur, transparency, vignetting:)

आप शायद इस resolve_pendingपरियोजना के लिए विशिष्ट विधि को हटाना चाहते हैं ।

खुशी है कि अगर मैंने आपकी मदद की, तो जिस परियोजना के बारे में मैं बात कर रहा हूं, उसके रेपो की जांच अवश्य करें , इस सवाल और सूत्र ने मुझे विकास पर बहुत मदद की :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.