Как разделить изображение с помощью сетки и сохранить прозрачность ограничивающей рамки - PullRequest
0 голосов
/ 11 июня 2018

У меня есть несколько изображений png, которые я хочу разделить на части, например, по сетке или размеру.

Но каждая часть должна иметь такую ​​же ограничивающую рамку (прозрачность), что и исходное изображение.

Пример:

Разделение изображения на 2 части.

Оригинал: 200 × 89

enter image description here

Выход:


part_1.png, 200 × 89

enter image description here


part_2.png, 200 × 89

enter image description here

Может ли ImageMagick сделать это?Или любое другое приложение или метод.

Моя настоящая цель состоит в том, чтобы разбить на 100+ фрагментов изображения.


РЕДАКТИРОВАТЬ:

Другая цельиметь отступов для каждого среза.Скажите indent = 10px.

Пример:

Ввод: 200 x 100

enter image description here


Выход:


part_1.png, 200 x 100

enter image description here


part_2.png, 200 x 100

enter image description here

И только в качестве примера, для визуального сравнения ввода и вывода: комбинированный выводизображения в Photoshop как слой добавляются друг к другу 200 x 100:

enter image description here

Также это показывает, что входное изображение добавлено к комбинированному (так что лучше посмотреть, чтобыло обрезано и как):

enter image description here

Ответы [ 6 ]

0 голосов
/ 12 июня 2018

Учитывая изменения требований, предоставленных Kamikaze, вот один из способов добиться разделения с отступом в ImageMagick, если я правильно понимаю.

enter image description here

dim=`convert image.png -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( image.png -crop 50x100% -shave 5x5 \) -geometry +5+5 -layers composite result.png

enter image description here

enter image description here

Чтобы проверить, я сглаживаю на синем фоне:

convert result-0.png result-1.png -background blue -flatten result.png

enter image description here

0 голосов
/ 12 июня 2018

Вот еще один способ добавить прозрачные области между частями обрезки в ImageMagick.Обрежьте изображение на части, отрежьте те части, которые вы хотите удалить, затем добавьте трубу к монтажу, чтобы добавить интервал.

Ввод:

enter image description here

Здесь я превращаю это в сетку изображений 4x4 с интервалом 10 пикселей:

convert lena.png -crop 25%x25% +repage -gravity east -chop 10x0 -gravity south -chop 0x10 +repage miff:- | montage - -background none -tile 4x4 -geometry +5+5 result.png

enter image description here

0 голосов
/ 12 июня 2018

Отредактировано, чтобы добавить этот пример ImageMagick 6, который разбивает входное изображение на 4 части, 25% оригинальной ширины и 100% его высоты, затем создает прозрачный холст для каждого куска с такими же размерами входного изображения и находитфрагменты с исходным смещением на этих полотнах.

convert input.png -set option:distort:viewport %[w]x%[h] -crop 25x100% \
   -virtual-pixel none -distort affine "0,0 %[fx:s.page.x],%[fx:s.page.y]" out%03d.png

Имена выходных файлов будут нумероваться, начиная с нуля, например "out000.png" и т. д.

Исходное сообщение ...

Вот простая команда, использующая ImageMagick 7, которая может обрезать изображение в любое количество фрагментов и выводить все фрагменты с исходными смещениями на прозрачном фоне исходных входных размеров ...

magick input.png -crop 100x1@ -background none \
   -extent "%[fx:s.page.width]x%[fx:s.page.height]-%[fx:s.page.x]-%[fx:s.page.y]" out%03d.png

То, что "-crop 100x1 @" говорит ему о том, чтобы разделить изображение на сетку шириной 100 штук и высотой 1 штука.Вы также можете указать размеры кадрирования в процентах или количестве пикселей.

Еще раз отредактируйте, чтобы добавить:

Эта следующая команда разделит входное изображение на отдельные части, указанные с помощью "-обрезать ", затем брить 5 пикселей с каждой стороны каждого куска, а затем применить прозрачную границу 5 пикселей для каждой стороны каждого куска.Он по-прежнему будет помнить исходное расположение фрагментов на входном холсте, поэтому «-distort affine ...» может расширить холсты и разместить фрагменты там, где они были на входном изображении.

convert input.png -set option:distort:viewport %[w]x%[h] \
   -bordercolor none -background none -virtual-pixel none \
   -crop 25x100% -shave 5x5 -border 5x5 \
   -distort affine "0,0 %[fx:s.page.x],%[fx:s.page.y]" out%03d.png

Чтобы использовать эту команду с IM7, вам нужно изменить «конвертировать» на «магию».

0 голосов
/ 12 июня 2018

В ImageMagick лучший способ поместить прозрачные области в ваше изображение - использовать двоичную маску, которая помещается в альфа-канал вашего изображения.

enter image description here

convert input.png \( -size 200x89 xc:white -size 10x89 xc:black -gravity center -composite \) -alpha off -compose copy_opacity -composite result.png


enter image description here

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

0 голосов
/ 11 июня 2018

Чтобы ответить на ваш новый вопрос, вы можете сделать это с помощью скриптового цикла.На Unix-подобной платформе, предполагая, что в ваших изображениях нет пробелов, вы можете сделать следующее:

cd path/to/current_folder
list=`ls *.png`
for img in $list; do
name=`convert $img -format "%t" info:`
dim=`convert $img -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( $img -crop 50x100% \) -layers composite -scene 1 path/to/new_folder/${name}_%d.png
done


Если вы хотите, чтобы в выводе были первые 0, скажем 3, используйте path / to /new_folder / $ {name} _% 03d.png.

Обратите внимание, что для начала с 1, а не с 0, я добавил -scene 1.

Извините, я не знаю, как создавать сценариидля Windows.

Пожалуйста, всегда указывайте версию и платформу ImageMagick.

0 голосов
/ 11 июня 2018

В ImageMagick вы можете разбить изображение на несколько частей с помощью команды -crop.Для приведенного выше примера, состоящего из двух частей, вы можете сделать это с помощью следующих команд.ImageMagick добавит -0, -1 ... к именам выходных файлов.

ImageMagick 6:

dim=`convert image.png -format "%wx%h" info:`
convert \( -size $dim xc:none \) null: \( image.png -crop 50x100% \) -layers composite result.png


ImageMagick 7:

magick \( image.png -set option:dim "%wx%h" -crop 50x100% \) null: \( -size "%[dim]" xc:none \) -reverse -layers composite result.png


Результаты:

enter image description here

enter image description here

См.

http://www.imagemagick.org/Usage/crop/#crop http://www.imagemagick.org/Usage/crop/#crop_percent http://www.imagemagick.org/Usage/crop/#crop_tile http://www.imagemagick.org/Usage/crop/#crop_quad http://www.imagemagick.org/Usage/crop/#crop_equal

http://www.imagemagick.org/script/command-line-options.php#layers

Обратите внимание, что -crop сохраняет виртуальный холстинформация, если вы не добавите + repage впоследствии.Таким образом, чтобы вернуть отдельные изображения в исходное положение, вы должны скомпоновать их на прозрачном фоне размером с входные данные.Это делается в одной команде с использованием составного -layers с использованием разделителя null:.

...