Abaixo de um script para criar um arquivo a partir de várias imagens. O script usa imagemagick
.
Sobre o imagemagick
A partir de man imagemagick
:
O ImageMagick® é uma suíte de software para criar, editar e compor imagens de bitmap. Ele pode ler, converter e gravar imagens em vários formatos (cerca de 100), incluindo GIF, JPEG, JPEG-2000, PNG, PDF, PhotoCD, TIFF e DPX. Use o ImageMagick para traduzir, inverter, espelhar, girar, dimensionar, distorcer e transformar imagens, ajustar cores de imagem, aplicar vários efeitos especiais ou desenhar texto, linhas, polígonos, elipses e curvas de Bezier.
Como o Imagemagick é uma ferramenta de linha de comando, ele é especialmente adequado para uso em scripts; para automatizar trabalhos como você menciona na sua pergunta, por exemplo.
Instalar o Imagemagick
Talvez seja necessário instalar o imagemagick primeiro:
sudo apt-get install imagemagick
O script
O script combina e organiza várias imagens em um arquivo. Ao fazer isso, ele usa o espaço máximo (em px
), definido por você, mas sem alterar as proporções da imagem . Quando o trabalho estiver concluído, a saída será aberta automaticamente em Gimp
(portanto, Gimp
deve ser instalado). Se, por algum motivo, o arquivo não aparecer em Gimp
, ele estará na pasta de imagens, chamada: out_file.jpg
.
Um exemplo
No exemplo abaixo, sua saída desejada é uma folha de três imagens (colunas) x três imagens (linhas), enquanto as imagens precisam ter 1500px (horizontal). Você precisará de uma área de 4500px (largura) e, ao mesmo tempo, certificar-se de que as três linhas se encaixam na área. Na seção principal do script, você define:
colrows = [3, 3] # set the number of colums/rows
max_area = [4500, 6500] # set the area (hxv in px) the script can use
como a altura é "oversized" para nossas imagens, o script preencherá a largura máxima (4500/3 = 1500px por imagem)
A saída:
O script pressupõe:
- todas as imagens são da mesma proporção & amp; orientação (podem, no entanto, ter tamanhos diferentes)
- o número de imagens dentro da pasta (veja acima) é igual a (ou pelo menos) linhas x colunas (9 no seu exemplo). Se houver mais imagens dentro da pasta, apenas o número necessário será usado.
Opções / configurações
O script tem várias opções. Na seção principal do script, você precisa definir:
img_dir = "/path/to/files" # path to the images
output_extension = ".jpg" # desired output
colrows = [3, 3] # columns / rows of pictures
max_area = [4500, 6500] # the (max) size of your sheet
border = 10 # whitespace around the images
O script
#!/usr/bin/env python3
import os
import subprocess
import shutil
# set the input below
###############################################################################
img_dir = "/path/to/files" # path to the images
output_extension = ".jpg" # desired output
colrows = [3, 3] # columns / rows of pictures
max_area = [4500, 6500] # the (max) size of your sheet
border = 10 # whitespace around the images
###############################################################################
cd_topics = "cd "+"'"+img_dir+"'; "
# current picture size
images = sorted([item for item in os.listdir(img_dir)])[:colrows[0]*colrows[1]]
for image in images:
shutil.copyfile(img_dir+"/"+image, img_dir+"/fixed_"+image.replace(" ", "_"))
images = sorted([item for item in os.listdir(img_dir) if item.startswith("fixed_")]) ##
# a few functions
def get_picsize(image):
command = cd_topics+'identify -format "%wx%h" '+image
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8").strip().split("x")
def resize(img_in, img_out, size, modus=None):
modus = "^ " if modus == "outsize" else " "
newsize = str(size)+"x"+str(size)
resize_command = cd_topics+"convert "+img_in+" -resize "+newsize+modus+img_out
subprocess.call(["/bin/bash", "-c", resize_command])
def add_border(img_in, img_out, bd):
if bd != None and str(bd) != "0":
addborder_command = cd_topics+"convert "+img_in+" -bordercolor white -border "+bd+"x"+bd+" "+img_out
subprocess.call(["/bin/bash", "-c", addborder_command])
# make all pictures of equal size
standard_size = get_picsize(images[0])
for pic in images:
if not get_picsize(pic) == standard_size:
resize(pic, pic, max(standard_size))
# calculate resize
picture_orientation = int(standard_size[0])/int(standard_size[1])
area_ratio = float(max_area[0]/max_area[1])
combi_ratio = (colrows[0]*int(standard_size[0]))/(colrows[1]*int(standard_size[1]))
fit_in = area_ratio/combi_ratio
if fit_in > 1:
newsize = int(max_area[1]/colrows[1])-2*border
modus = "outsize" if picture_orientation > 1 else None
else:
newsize = int(max_area[0]/colrows[0])-2*border
modus = "outsize" if picture_orientation < 1 else None
# resize images
for image in images:
resize(image, "rs_"+image, newsize, modus)
add_border("rs_"+image, "rs_"+image, bd=str(border))
# combining into rows
images = sorted([pic for pic in os.listdir(img_dir) if pic.startswith("rs_")])
rows = [images[i:i+colrows[0]] for i in range(len(images)-colrows[0]+1) if i % colrows[0]== 0]
i = 0
while i in range(len(rows)):
row = rows[i]; images = [im for im in row]
command = cd_topics+"convert "+" ".join(images)+" +append "+"row_"+str(i+1)+output_extension
subprocess.call(["/bin/bash", "-c", command])
i = i+1
# combining rows
images = sorted([pic for pic in os.listdir(img_dir) if pic.startswith("row")])
output_file = "out_file"+output_extension
command = cd_topics+"convert "+(" ").join(images)+" -append "+output_file
subprocess.call(["/bin/bash", "-c", command])
# opening image with Gimp, cleaning up
for image in sum([[img for img in os.listdir(img_dir) if img.startswith(string)] \
for string in ["fixed_", "row_", "rs_"]], []):
os.remove(img_dir+"/"+image)
command = cd_topics+"gimp "+output_file
subprocess.Popen(["/bin/bash", "-c", command])
Como usar
- Copie o script em um arquivo vazio, salve-o como
combine.py
. Defina as informações desejadas no cabeçalho do script (consulteOptions / settings
, acima). - Copie o número apropriado de fotos em uma pasta
-
Execute o script pelo comando:
python3 /path/to/combine.py
Algumas notas
- O script cria uma nova imagem (
outfile
). Se você fizer outra combinação das mesmas imagens (-diretório), primeiro remova-a ou ela poderá aparecer no arquivo de saída. - O script classifica as imagens por nome, portanto, se você precisar de uma ordem específica, nomeie-as como a.jpg, b.jpg e assim por diante.