#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.