Saya mencoba menggabungkan secara horizontal beberapa gambar JPEG dengan Python.
Masalah
Saya memiliki 3 gambar - masing-masing 148 x 95 - lihat terlampir. Saya baru saja membuat 3 salinan dari gambar yang sama - itulah mengapa mereka sama.
Upaya saya
Saya mencoba untuk bergabung dengan mereka secara horizontal menggunakan kode berikut:
import sys
from PIL import Image
list_im = ['Test1.jpg','Test2.jpg','Test3.jpg']
new_im = Image.new('RGB', (444,95)) #creates a new empty image, RGB mode, and size 444 by 95
for elem in list_im:
for i in xrange(0,444,95):
im=Image.open(elem)
new_im.paste(im, (i,0))
new_im.save('test.jpg')
Namun, ini menghasilkan keluaran yang terpasang sebagai test.jpg
.
Pertanyaan
Apakah ada cara untuk menggabungkan gambar-gambar ini secara horizontal sehingga sub-gambar di test.jpg tidak menampilkan gambar parsial tambahan?
informasi tambahan
Saya mencari cara untuk menggabungkan n gambar secara horizontal. Saya ingin menggunakan kode ini secara umum, jadi saya lebih suka:
- bukan untuk dimensi gambar hard-code, jika memungkinkan
- tentukan dimensi dalam satu baris agar dapat diubah dengan mudah
for i in xrange(...)
di kode Anda? Tidakkah seharusnyapaste
menangani tiga file gambar yang Anda tentukan?Jawaban:
Anda bisa melakukan sesuatu seperti ini:
Test1.jpg
Test2.jpg
Test3.jpg
test.jpg
Bertingkat untuk
for i in xrange(0,444,95):
menempelkan setiap gambar 5 kali, dipisahkan dengan jarak 95 piksel. Setiap iterasi loop luar menempel di atas sebelumnya.sumber
x_offset = 0
- apakah ini pemisah antara pusat gambar? 2. Untuk penggabungan vertikal, bagaimana pendekatan Anda berubah?x_offset
sebagaileft
. Untuk concat vertikal, perhatikany-offset
, atautop
. Dari padasum(widths)
danmax(height)
, lakukansum(heights)
danmax(widths)
dan gunakan argumen kedua dari kotak 2-tupel. incrementy_offset
olehim.size[1]
.map
di python3.6Saya akan mencoba ini:
Ini harus berfungsi selama semua gambar memiliki variasi yang sama (semua RGB, semua RGBA, atau semua skala abu-abu). Seharusnya tidak sulit untuk memastikan hal ini terjadi dengan beberapa baris kode lagi. Berikut adalah contoh gambar saya, dan hasilnya:
Test1.jpg
Test2.jpg
Test3.jpg
Trifecta.jpg:
Trifecta_vertical.jpg
sumber
min_shape =....
danimgs_comb....
mengubah penggabungan vertikal? Bisakah Anda mempostingnya di sini sebagai komentar, atau dalam balasan Anda?hstack
kevstack
.Image.resize
dari PIL.min_shape
adalah tupel dari (min_width, min_height) dan kemudian(np.asarray( i.resize(min_shape) ) for i in imgs )
akan mengecilkan semua gambar ke ukuran tersebut. Sebenarnya,min_shape
bisa apa saja yang(width,height)
Anda inginkan, perlu diingat bahwa memperbesar gambar beresolusi rendah akan membuatnya buram!Edit: Jawaban DTing lebih dapat diterapkan pada pertanyaan Anda karena menggunakan PIL, tetapi saya akan membiarkannya jika Anda ingin tahu bagaimana melakukannya secara numpy.
Berikut adalah solusi numpy / matplotlib yang seharusnya berfungsi untuk gambar N (hanya gambar berwarna) dari berbagai ukuran / bentuk.
Berikut ini contoh penggunaan:
sumber
output = concat_images(output, ...
adalah apa yang saya cari ketika saya mulai mencari cara untuk melakukan ini. Terima kasih.Berdasarkan jawaban DTing saya membuat fungsi yang lebih mudah digunakan:
Ini memungkinkan memilih warna latar belakang dan penyelarasan gambar. Rekursi juga mudah dilakukan:
sumber
Berikut adalah fungsi yang menggeneralisasi pendekatan sebelumnya, membuat kisi gambar di PIL:
Ini akan mengecilkan setiap baris dan kolom dari grid ke minimum. Anda hanya dapat memiliki satu baris dengan menggunakan pil_grid (gambar), atau hanya kolom dengan menggunakan pil_grid (gambar, 1).
Salah satu keuntungan menggunakan PIL dibandingkan solusi berbasis numpy-array adalah Anda dapat menangani gambar yang terstruktur secara berbeda (seperti gambar berbasis grayscale atau palet).
Contoh keluaran
pil_grid(dummy_images)
:pil_grid(dummy_images, 3)
:pil_grid(dummy_images, 1)
:sumber
h_sizes, v_sizes = [0] * n_horiz, [0] * (n_images // n_horiz)
harus dibaca:h_sizes, v_sizes = [0] * n_horiz, [0] * ((n_images // n_horiz) + (1 if n_images % n_horiz > 0 else 0))
Alasan: Jika lebar horizontal tidak membagi jumlah gambar dalam bilangan bulat, Anda perlu mengakomodasi baris tambahan jika tidak lengkap.Jika semua tinggi gambar sama,
mungkin Anda bisa mengubah ukuran gambar sebelum penggabungan seperti ini,
sumber
Inilah solusi saya:
Untuk gambar-gambar ini:
Hasilnya akan terlihat seperti:
sumber
sumber
Keluaran
sumber
Hanya menambahkan solusi yang sudah disarankan. Asumsikan ketinggian yang sama, tidak ada pengubahan ukuran.
sumber
solusi saya adalah:
sumber