Saya memiliki gambar png transparan "foo.png" dan saya sudah membuka gambar lain dengan
im = Image.open("foo2.png");
sekarang yang saya butuhkan adalah menggabungkan foo.png dengan foo2.png.
(foo.png berisi beberapa teks dan saya ingin mencetak teks itu di foo2.png)
;
di akhir perintah Anda dengan python: Ini jelek ...Jawaban:
Parameter pertama
.paste()
adalah gambar untuk di-paste. Kedua adalah koordinat, dan saus rahasia adalah parameter ketiga. Ini menunjukkan topeng yang akan digunakan untuk menempelkan gambar. Jika Anda melewatkan gambar dengan transparansi, maka saluran alfa digunakan sebagai mask.Periksa dokumen .
sumber
foreground.convert('RGBA')
untuk parameter mask.ValueError: bad transparency mask
ValueError: bad transparency mask
penggunaanbg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
tidak berfungsi seperti yang diharapkan ketika gambar latar belakang juga mengandung transparansi. Anda harus menggunakan Pengomposisian Alfa asli .Pillow 2.0 berisi
alpha_composite
fungsi yang melakukan ini.EDIT: Kedua gambar harus dari jenis RGBA. Jadi, Anda perlu menelepon
convert('RGBA')
jika mereka palet, dll. Jika latar belakang tidak memiliki saluran alpha, maka Anda dapat menggunakan metode tempel biasa (yang harus lebih cepat).sumber
ValueError: image has wrong made
juga @DenizOzgerSeperti yang sudah ditunjukkan olt ,
Image.paste
tidak berfungsi dengan baik, ketika sumber dan tujuan keduanya mengandung alfa.Pertimbangkan skenario berikut:
Dua gambar uji, keduanya mengandung alfa:
Mengomposit gambar menggunakan
Image.paste
seperti:menghasilkan gambar berikut (bagian alfa dari piksel merah overlay sepenuhnya diambil dari lapisan 2. Pixel tidak dicampur dengan benar):
Mengomposit gambar menggunakan
Image.alpha_composite
seperti:menghasilkan gambar (benar) berikut:
sumber
alpha_composite
tidak bisa mengatur offset, maukah Anda memberikan contoh untuk sepenuhnya menggantikanpaste
fungsi?Satu juga dapat menggunakan blending:
sumber
sumber
Punya pertanyaan serupa dan kesulitan menemukan jawaban. Fungsi berikut memungkinkan Anda untuk menempelkan gambar dengan parameter transparansi di atas gambar lain pada offset tertentu.
sumber
ValueError: images do not match
Saya akhirnya coding sendiri saran dari komentar ini dibuat oleh pengguna @ P.Melch dan disarankan oleh @Mithril pada proyek yang sedang saya kerjakan.
Saya kode keluar dari batas keamanan juga, ini kode untuk itu . (Saya menautkan komit tertentu karena hal-hal dapat berubah di masa depan repositori ini)
Catatan: Saya berharap array numpy dari gambar seperti sehingga
np.array(Image.open(...))
input A dan B daricopy_from
danoverlay
argumen fungsi terkait ini .Ketergantungan adalah fungsi tepat sebelum itu,
copy_from
metode, dan array numpy sebagai konten Gambar PIL untuk mengiris.Meskipun file tersebut sangat berorientasi kelas, jika Anda ingin menggunakan fungsi itu
overlay_transparent
, pastikan untuk mengganti namaself.frame
ke array numpy gambar latar belakang Anda.Atau Anda bisa menyalin seluruh file (mungkin menghapus beberapa impor dan
Utils
kelas) dan berinteraksi dengan kelas Bingkai ini seperti:Kemudian, Anda memiliki
background.frame
array yang dikomposisikan secara overlay dan alfa, Anda bisa mendapatkan gambar PIL darinya denganoverlayed = Image.fromarray(background.frame)
atau sesuatu seperti:Atau sama
background.save("save path")
seperti yang mengambil langsung dari internal yang dikomposisikan alfaself.frame
variabel .Anda dapat membaca file dan menemukan beberapa fungsi lainnya baik dengan implementasi saya ini kode seperti metode
get_rgb_frame_array
,resize_by_ratio
,resize_to_resolution
,rotate
,gaussian_blur
,transparency
,vignetting
:)Anda mungkin ingin menghapus
resolve_pending
metode karena itu spesifik untuk proyek itu.Senang jika saya membantu Anda, pastikan untuk memeriksa repo proyek yang saya bicarakan, pertanyaan dan utas ini banyak membantu saya dalam pengembangan :)
sumber