পিআইএল ব্যবহার করে কীভাবে একটি স্বচ্ছ পিএনজি চিত্রটি অন্য চিত্রের সাথে মার্জ করা যায়


151

আমার একটি স্বচ্ছ png চিত্র "foo.png" আছে এবং আমি এর সাথে অন্য একটি চিত্র খুললাম

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

এখন আমার যা দরকার তা হল foo.png সাথে foo2.png একত্রিত করা।

(foo.png এ কিছু পাঠ্য রয়েছে এবং আমি সেই লেখাটি foo2.png এ মুদ্রণ করতে চাই)



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
গোপন
সসটি

3
@ ডেনিজোজার 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")

সম্পাদনা: উভয় চিত্রই আরজিবিএ টাইপের হওয়া দরকার। সুতরাং convert('RGBA')সেগুলি প্যালেট করা থাকলে আপনাকে কল করতে হবে ইত্যাদি ..


আমি স্রেফ পিআইএল দিয়ে একটি অর্ধ-স্বচ্ছ চিত্র ওভারলে করতে পেস্ট () ব্যবহার করেছি এবং এটি আমার প্রত্যাশা অনুযায়ী কাজ করেছে। আপনার প্রত্যাশা অনুযায়ী কোনভাবে এটি কাজ করে না?
পিটার হানসেন

3
@ পিটারহানসেন, পেস্ট () প্রত্যাশার মতো কাজ করে না "যখন ব্যাকগ্রাউন্ড ইমেজটিতে স্বচ্ছতা থাকে"।
হোম

1
@PeterHansen উদাহরণ নেই: github.com/python-pillow/Pillow/issues/...
homm

@ হোম ধন্যবাদ এটি অনেক আগে ছিল আমি কী চেষ্টা করেছি তার কোনও স্মৃতি নেই। মনে হয় আপনি ব্যাকগ্রাউন্ড চিত্র সম্পর্কে যে অংশটি উদ্ধৃত করেছেন তা আমি মিস করেছি, স্বচ্ছতাও রয়েছে।
পিটার হ্যানসেন

4
আমি ValueError: image has wrong made
@

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)

নিম্নলিখিত চিত্রটি উত্পন্ন করে (ওভারলেড লাল পিক্সেলের আলফা অংশটি সম্পূর্ণভাবে দ্বিতীয় স্তর থেকে নেওয়া হয়েছে The পিক্সেলগুলি সঠিকভাবে মিশ্রিত হয়নি):

এখানে চিত্র বর্ণনা লিখুন

ছবিটির 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
আমার ধারণা আপনি গেরেটের চিত্রের মতো একই আকারের সাথে একটি নতুন খালি চিত্র তৈরি করতে হবে, স্তরটি যথাযথ স্থানে আটকে দিতে হবে এবং লক্ষ্য চিত্রের সাথে নতুন চিত্রটি মিশ্রিত করতে আলফা_কম্পোজিত ব্যবহার করতে হবে।
পি। মেলচ

11

কেউ মিশ্রণটিও ব্যবহার করতে পারেন:

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

1
এই এক অ্যাসিটিক্যালি আমার জন্য কাজ করেছে। চিত্রগুলির অবশ্যই একই আকার থাকতে হবে তবে এটি ঠিক আছে। পেস্ট ফাংশনটি আমার পক্ষে এটি খুব একটা কাটেনি ...
লিভিউ সোসু

2
'মান মূল্য: চিত্রগুলি মেলে না'
স্কটজ

2
সম্ভবত, তারা বিভিন্ন মাত্রা হয়। আপনাকে সেগুলির মধ্যে একটি স্কেল বা ক্রপ করতে হতে পারে।
এনভিডি

2
@ শোটজি এনভিডির মন্তব্য দেখুন কারণ সে আপনাকে পিং করে নি (@ ব্লাবলাহ ব্যবহার করে)
মিল্কিওয়ে 90

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

আমি @ পি.মেলচ ব্যবহারকারী এবং মন্তব্য করা মিথ্রিলের দ্বারা আমি যে প্রকল্পে কাজ করছি তার মন্তব্যের পরামর্শটি কোডিং শেষ করেছি ।

আমি সীমানা সুরক্ষার বাইরেও কোড করেছিলাম, এর জন্য এখানে কোড । (আমি একটি নির্দিষ্ট প্রতিশ্রুতি যুক্ত করেছি কারণ জিনিসগুলি এই ভাণ্ডারের ভবিষ্যতে পরিবর্তন হতে পারে)

নোট: থেকে চিত্রগুলি তাই পছন্দ করি আমি numpy অ্যারে আশা np.array(Image.open(...))ইনপুট A এবং B থেকে 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সেই প্রকল্পটি সরাতে চাইবেন যেটি সেই প্রকল্পের জন্য নির্দিষ্ট।

খুশী যদি আমি আপনাকে সহায়তা করি, আমি যে প্রকল্পের কথা বলছি তার রেপো অবশ্যই পরীক্ষা করে দেখুন , এই প্রশ্ন এবং থ্রেড আমাকে উন্নয়নের ক্ষেত্রে অনেক সহায়তা করেছে :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.