Tôi có một hình ảnh png trong suốt "foo.png" và tôi đã mở một hình ảnh khác với
im = Image.open("foo2.png");
bây giờ những gì tôi cần là hợp nhất foo.png với foo2.png.
(foo.png chứa một số văn bản và tôi muốn in văn bản đó trên foo2.png)
Tôi có một hình ảnh png trong suốt "foo.png" và tôi đã mở một hình ảnh khác với
im = Image.open("foo2.png");
bây giờ những gì tôi cần là hợp nhất foo.png với foo2.png.
(foo.png chứa một số văn bản và tôi muốn in văn bản đó trên foo2.png)
Câu trả lời:
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
Tham số đầu tiên .paste()
là hình ảnh để dán. Thứ hai là tọa độ, và nước sốt bí mật là tham số thứ ba. Nó chỉ ra một mặt nạ sẽ được sử dụng để dán hình ảnh. Nếu bạn vượt qua một hình ảnh có độ trong suốt, thì kênh alpha được sử dụng làm mặt nạ.
Kiểm tra tài liệu .
foreground.convert('RGBA')
cho tham số mặt nạ.
ValueError: bad transparency mask
ValueError: bad transparency mask
việc sử dụngbg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
không hoạt động như mong đợi khi hình nền cũng chứa độ trong suốt. Bạn cần sử dụng Alpha Compositing thực sự .
Gối 2.0 chứa một alpha_composite
chức năng thực hiện điều này.
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
EDIT: Cả hai hình ảnh cần phải thuộc loại RGBA. Vì vậy, bạn cần gọi convert('RGBA')
nếu chúng bị mờ, vv .. Nếu nền không có kênh alpha, thì bạn có thể sử dụng phương pháp dán thông thường (nên nhanh hơn).
ValueError: image has wrong made
cũng @DenizOzger
Như olt đã chỉ ra, Image.paste
không hoạt động đúng, khi cả nguồn và đích đều chứa alpha.
Hãy xem xét kịch bản sau đây:
Hai hình ảnh thử nghiệm, cả hai đều chứa alpha:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Tổng hợp hình ảnh bằng cách sử dụng Image.paste
như vậy:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
tạo ra hình ảnh sau (phần alpha của các pixel màu đỏ được phủ hoàn toàn được lấy từ lớp thứ 2. Các pixel không được trộn chính xác):
Tổng hợp hình ảnh bằng cách sử dụng Image.alpha_composite
như vậy:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
tạo ra hình ảnh (chính xác) sau đây:
alpha_composite
không thể đặt bù, bạn có muốn đưa ra một ví dụ để thay thế hoàn toàn paste
chức năng không?
Người ta cũng có thể sử dụng pha trộn:
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
Có một câu hỏi tương tự và gặp khó khăn khi tìm câu trả lời. Chức năng sau đây cho phép bạn dán một hình ảnh với tham số trong suốt trên một hình ảnh khác ở một độ lệch cụ thể.
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
Tôi đã kết thúc việc tự mã hóa đề xuất của bình luận nàyCuối cùng do người dùng @ P.Melch đưa ra và được đề xuất bởi @Mithril trong một dự án tôi đang thực hiện.
Tôi cũng đã mã hóa ra khỏi giới hạn an toàn, đây là mã cho nó . (Tôi đã liên kết một cam kết cụ thể vì mọi thứ có thể thay đổi trong tương lai của kho lưu trữ này)
Lưu ý: Tôi mong đợi các mảng numpy từ các hình ảnh giống np.array(Image.open(...))
như các đầu vào A và B từ copy_from
và các overlay
đối số chức năng được liên kết này .
Các phụ thuộc là hàm ngay trước nó, copy_from
phương thức và mảng numpy như nội dung PIL Image để cắt.
Mặc dù tệp được định hướng rất đẳng cấp, nhưng nếu bạn muốn sử dụng chức năng đó overlay_transparent
, hãy nhớ đổi tênself.frame
mảng numpy hình ảnh nền của bạn.
Hoặc bạn chỉ có thể sao chép toàn bộ tệp (có thể xóa một số nhập và Utils
lớp) và tương tác với lớp Khung này như sau:
# 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)
Sau đó, bạn có background.frame
mảng tổng hợp lớp phủ và alpha, bạn có thể nhận được hình ảnh PIL từ nó với overlayed = Image.fromarray(background.frame)
hoặc đại loại như:
overlayed = Frame()
overlayed.load_from_array(background.frame)
Hoặc chỉ cần background.save("save path")
lấy trực tiếp từ nội bộ tổng hợp alphaself.frame
biến .
Bạn có thể đọc các tập tin và tìm thấy một số chức năng tuyệt vời khác với thi này tôi mã hóa như các phương pháp get_rgb_frame_array
, resize_by_ratio
, resize_to_resolution
, rotate
, gaussian_blur
, transparency
,vignetting
:)
Bạn có thể muốn loại bỏ resolve_pending
phương thức đó là cụ thể cho dự án đó.
Rất vui nếu tôi đã giúp bạn, hãy chắc chắn kiểm tra repo của dự án mà tôi đang nói đến, câu hỏi và chủ đề này đã giúp tôi rất nhiều về sự phát triển :)
;
ở cuối lệnh của bạn trong python: Thật xấu xí ...