मेरे पास एक पारदर्शी png छवि है "foo.png" और मैंने इसके साथ एक और छवि खोली है
im = Image.open("foo2.png");
अब मुझे foo2.png के साथ foo.png को मर्ज करने की आवश्यकता है।
(foo.png में कुछ पाठ हैं और मैं उस पाठ को foo2.png पर प्रिंट करना चाहता हूं)
मेरे पास एक पारदर्शी png छवि है "foo.png" और मैंने इसके साथ एक और छवि खोली है
im = Image.open("foo2.png");
अब मुझे foo2.png के साथ foo.png को मर्ज करने की आवश्यकता है।
(foo.png में कुछ पाठ हैं और मैं उस पाठ को foo2.png पर प्रिंट करना चाहता हूं)
जवाबों:
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
पहला पैरामीटर .paste()पेस्ट करने के लिए छवि है। दूसरा निर्देशांक हैं, और गुप्त सॉस तीसरा पैरामीटर है। यह एक मुखौटा को इंगित करता है जिसका उपयोग छवि को चिपकाने के लिए किया जाएगा। यदि आप एक छवि को पारदर्शिता के साथ पास करते हैं, तो अल्फा चैनल का उपयोग मुखौटा के रूप में किया जाता है।
डॉक्स की जाँच करें ।
foreground.convert('RGBA')मास्क पैरामीटर के लिए उपयोग करें ।
ValueError: bad transparency mask
ValueError: bad transparency maskउपयोग ठीक करने के लिएbg.paste(fg, (0, 0), fg.convert('RGBA'))
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')यदि वे तालू, आदि हैं। यदि पृष्ठभूमि में एक अल्फा चैनल नहीं है, तो आप नियमित पेस्ट विधि का उपयोग कर सकते हैं (जो तेज होना चाहिए)।
ValueError: image has wrong made@DenizOzger
जैसा कि ओल्ट ने पहले ही बताया, 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)
निम्नलिखित (सही) छवि तैयार करता है:
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")
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
एक समान प्रश्न था और एक उत्तर खोजने में कठिनाई थी। निम्नलिखित फ़ंक्शन आपको एक छवि को एक विशिष्ट ऑफसेट पर एक अन्य छवि पर पारदर्शिता पैरामीटर के साथ पेस्ट करने की अनुमति देता है।
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(...))ए और बी जैसे 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परियोजना के लिए विशिष्ट विधि को हटाना चाहते हैं ।
खुशी है कि अगर मैंने आपकी मदद की, तो जिस परियोजना के बारे में मैं बात कर रहा हूं, उसके रेपो की जांच अवश्य करें , इस सवाल और सूत्र ने मुझे विकास पर बहुत मदद की :)
;अजगर में अपने आदेशों के अंत में उपयोग न करें : यह बदसूरत है ...