ฉันมีรูปแบบ png โปร่งใส "foo.png" และฉันเปิดภาพอื่นด้วย
im = Image.open("foo2.png");
ตอนนี้สิ่งที่ฉันต้องการคือการรวม foo.png กับ foo2.png
(foo.png มีข้อความบางส่วนและฉันต้องการพิมพ์ข้อความนั้นบน foo2.png)
ฉันมีรูปแบบ png โปร่งใส "foo.png" และฉันเปิดภาพอื่นด้วย
im = Image.open("foo2.png");
ตอนนี้สิ่งที่ฉันต้องการคือการรวม foo.png กับ foo2.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
ไม่ทำงานอย่างที่คาดไว้เมื่อภาพพื้นหลังมีความโปร่งใส คุณจำเป็นต้องใช้จริงอัลฟา Compositing
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
ทำงานไม่ถูกต้องเมื่อแหล่งที่มาและปลายทางมีทั้งอัลฟ่า
พิจารณาสถานการณ์สมมติต่อไปนี้:
ภาพทดสอบสองภาพทั้งคู่มีอัลฟา:
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 ในโครงการที่ฉันกำลังทำงานอยู่
ฉันออกรหัสความปลอดภัยขอบเขตเช่นกันนี่คือรหัสสำหรับมัน (ฉันเชื่อมโยงการมอบหมายที่เฉพาะเจาะจงเพราะสิ่งต่าง ๆ สามารถเปลี่ยนแปลงได้ในอนาคตของที่เก็บนี้)
หมายเหตุ: ฉันคาดหวังอาร์เรย์ numpy จากภาพเช่นnp.array(Image.open(...))
เป็นอินพุต A และ B จากcopy_from
และoverlay
ข้อโต้แย้งฟังก์ชั่นที่เชื่อมโยงนี้
การพึ่งพาคือฟังก์ชันที่อยู่ก่อนหน้าcopy_from
วิธีการและอาร์เรย์ที่มีจำนวนมากในรูปแบบ PIL Image สำหรับการแบ่งส่วน
แม้ว่าไฟล์นั้นจะเป็นแบบคลาสสิก แต่ถ้าคุณต้องการใช้ฟังก์ชั่น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
เป็นอาร์เรย์แบบเรียงซ้อนและอัลฟาคุณสามารถรับภาพ PIL จากมันด้วย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
วิธีการเฉพาะสำหรับโครงการนั้น
ดีใจที่ฉันช่วยคุณตรวจสอบ repo ของโครงการที่ฉันกำลังพูดถึงคำถามและหัวข้อนี้ช่วยฉันได้มากในการพัฒนา :)
;
ปลายคำสั่งของคุณในไพ ธ อน: มันน่าเกลียด ...