Измените размер и расположите изображения автоматически на холсте

Я хочу сделать шаблон для печати 9 карт 63 x 88 мм на листе А4 DIN, я хочу загрузить изображения так, чтобы они изменили размер себя, и я могу распечатать их непосредственно. Как я могу сделать это?

2
задан 2 December 2014 в 15:09

1 ответ

Ниже сценария для создания одного файла из многих изображений. Использование сценария imagemagick.

О imagemagick

От man imagemagick:
ImageMagick®, программный пакет, чтобы создать, отредактировать, и составить растровые изображения. Это может прочитать, преобразовать и записать изображения во множестве форматов (приблизительно 100) включая GIF, JPEG, JPEG 2000, PNG, PDF, PhotoCD, TIFF и DPX. Используйте ImageMagick, чтобы перевести, зеркально отразить, зеркально отразить, повернуть, масштабировать, сдвинуть и преобразовать изображения, скорректировать цвета изображения, применить различные специальные эффекты или нарисовать текст, строки, полигоны, замещающие знаки и Кривые Безье.

Так как Imagemagick является инструментом командной строки, это особенно годно к использованию в сценариях; для автоматизации заданий как Вы упоминают в Вашем вопросе, например.

Установка Imagemagick

Вам, возможно, придется установить imagemagick сначала:

sudo apt-get install imagemagick

Сценарий

Объединения сценария и расположения много изображений в один файл. Делая так, это использует максимальное пространство (в px), определенный Вами, но не изменяя пропорции изображения. После того как задание сделано, вывод автоматически открыт в Gimp (так Gimp должен быть установлен). Если по некоторым причинам файл не обнаруживается в Gimp, это находится в папке Ваших изображений, названной: out_file.jpg.

enter image description here

Пример

В примере ниже, Ваш желаемый вывод является листом трех изображений (столбцы) x три изображения (строки), в то время как изображения должны составить (горизонтальных) 1500 пкс. Вам будет нужна область 4500 пкс (шириной), и в то же время удостоверьтесь, что эти три строки помещаются в область. В главном разделе сценария Вы устанавливаете:

colrows = [3, 3]            # set the number of colums/rows
max_area = [4500, 6500]     # set the area (hxv in px) the script can use

начиная с верхнего уровня "увеличенного размера" для наших изображений, сценарий заполнит upt максимальная ширина (4500/3 = 1500 пкс за изображение)

Вывод:

enter image description here

Сценарий принимает:

  • все изображения имеют ту же пропорцию и ориентацию (они могут однако иметь различные размеры),
  • количество изображений в папке (см. выше) равно (или по крайней мере) строки x столбцы (9 в Вашем примере). Если существует больше изображений в папке, только необходимое число используется.

Опции / настройки

Сценарий имеет много опций. В главном разделе сценария необходимо определить:

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

Сценарий

#!/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])

Как использовать

  • Скопируйте сценарий в пустой файл, сохраните его как combine.py. Установите желаемую информацию в headsection сценария (см. Options / settings, выше).
  • Скопируйте approriate количество изображений в папку
  • Запустите скрипт командой:

    python3 /path/to/combine.py
    

Несколько примечаний

  • Сценарий создает новое изображение (outfile). Если Вы делаете другую комбинацию тех же изображений (-каталог), сначала удаляют его, или это могло бы появиться в выходном файле.
  • Сценарий сортирует изображения по имени, поэтому если Вы нуждаетесь в особом порядке, просто называете их a.jpg, b.jpg и так далее.
3
ответ дан 2 December 2019 в 02:59

Другие вопросы по тегам:

Похожие вопросы: