Добавьте отступы к изображению, чтобы сделать его квадратным с помощью ImageMagick

#imagemagick #imagemagick-convert

#imagemagick #imagemagick-преобразовать

Вопрос:

Мне дали папку, полную изображений с продуктами на белом фоне, и попросили сделать все они квадратными, и все они имеют одинаковое количество отступов вокруг продуктов.

Я бы хотел избежать изменения размера самого изображения, поэтому мой план состоит в том, чтобы обрезать изображение, добавить отступы, сделать изображение квадратным, а затем добавить границу к изображению в процентах от результирующего изображения.

Единственная часть, которую я не смог понять, — это как сделать отступ. Все примеры возведения изображений в квадрат, которые я видел, изменяют размер изображения в процессе. Нет ли способа найти самый длинный размер и изменить его размер на основе этого?

Пример: у меня есть следующее изображение: введите описание изображения здесь

Мне нужно, чтобы это выглядело так: введите описание изображения здесь

У меня пока нет кода для ImageMagick (кроме простой команды trim и border). Идея состоит в том, чтобы обрезать пробелы, затем сделать изображение квадратным, оставив продукт (в данном случае прямоугольный черный ящик) в центре изображения. Наконец, добавляется граница, чтобы обеспечить отступы к изображению.

Комментарии:

1. Пожалуйста, приведите конкретный пример изображения и того, как оно должно быть выровнено и дополнено, а также какой код у вас есть на данный момент

2. Я добавил пример изображения и желаемый результат.

3. Итак, ваше обрезанное изображение имеет размер 629×157 — правильно? Откуда вы знаете, что оно должно стать 758×758?

4. Я использовал калькулятор. В ImageMagick я добавлю 20% границы.

Ответ №1:

Я думаю, что это что-то вроде этого:

 #!/bin/bash
# Get trim box w, h, x, y
IFS=" x " read w h x y < <(convert -fuzz 10% start.jpg -format "%@" info:)

# Get longest side
longest=$w
[ $h -gt $longest ] amp;amp; longest=$h

# Increase by 20%
longest=$(echo "scale=0;$longest*1.2/1" | bc)
echo $longest

convert -fuzz 10% start.jpg -trim -background white -gravity center -extent ${longest}x${longest} result.jpg
  

Если вы не знакомы с «bashisms», вы можете запустить

 convert -fuzz 10% start.jpg -format "%@" info:
  

чтобы увидеть, что делает эта первая команда — она просто получает поле обрезки без фактической обрезки. Попробуйте добавить эту строку после нее:

 echo $w, $h, $x, $y
  

Комментарии:

1. Спасибо, похоже, это работает. Я попробую немного настроить его, чтобы я мог запускать его над каталогом изображений. Я пробовал fx:max(w, h) при определении размера моего экстента, но это не работает. Я не уверен, почему.

2. Использование этого метода приведет к разрыву внутри цикла for. Я обнаружил, что другим способом получения ширины может быть: w = identify -format '$w' $i

Ответ №2:

С Linux в качестве сценария оболочки:

 for file in *.png ;  # or jpg,....
    do  IMG_W=$(identify -ping -format '%w' $file); 
    IMG_H=$(identify -ping -format '%h' $file); 
##   echo "$file: w: $IMG_W x h $IMG_H"; 
##   do something like
##   DIN A5: 2331x3307 pixel 400 dpi
##   half the width of white border
#   XPLUS=$(echo " ( 2331 - $IMG_W ) / 2 " |bc) ; 
#   YPLUS=250                                     
##   250 pixel from top border
##   echo "position: Xplus $XPLUS Yplus $YPLUS";
##   according to the calculations combine with white picture (background)
#   composite -geometry  $XPLUS $YPLUS $file white.png ../tmp7/$file;
done
  

В примере (с комментариями) показано, как вычислять и объединять с файлом. Я не знаю, из какого источника я получил 2 строки сценария выше (который является частью сценария, который я написал), я думаю, от Энтони Тиссена на его превосходном сайте «Примеры использования ImageMagick».

Ответ №3:

Этот код взят из ответа Марка Сетчелла на этот вопрос, переписан в fish shell script. Я использовал его решение, чтобы добавить отступы вокруг изображения, чтобы сделать его квадратным.

 #!/usr/bin/fish
convert -fuzz 10% $argv -format "%@" info: 
          | string split x 
          | string split   
          | read -L w h x y

set longest $w
[ $h -gt $longest ] amp;amp; set longest $h
set longest (math -s0 $longest*1.2)

set output_file result-000.png
[ -f $output_file ] 
  amp;amp; echo "file $output_file already exists" 
  || echo "file $output_file will be created" 
[ -f $output_file ] 
  || convert -fuzz 10% $argv -trim -background white -gravity center -extent {$longest}x{$longest} $output_file
  

Сохраните как файл, например frame.fish , предоставьте ему разрешение на выполнение, chmod x frame.fish , и запустите с файлом ./frame.fish imageinput.png .

string split будет разбираться на разные строки по каждому разделителю. read -L будет считываться в каждую строку. math -s0 создайте десятичную дробь с нулевым масштабом в fish shell.