Сгладить слои, выровняв их по центрам, а не по верхним левым углам

Как я могу перекрывать несколько изображений, чтобы их центры находились прямо над центрами друг друга?

Я использую -layers merge вместо -layers flatten, потому что сведение обрезает изображения, чтобы они соответствовали размерам первого изображения, но вместо этого слияние расширяет «холст», и я хочу иметь возможность видеть каждое из входных изображений целиком.

Поведение -layers merge и -layers flatten по умолчанию — выравнивание верхних левых углов:

convert wizard: \( logo: -transparent white \) \( rose: -transparent white \) -background white -layers merge merged.png

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

Желаемый результат:

Используйте -set page в конце внутри каждой скобки, чтобы выровнять верхние левые углы при использовании слияния -layers. Вам необходимо вычислить смещения от центра до верхних левых углов на основе размеров изображения. Или, имея всего два изображения, используйте -центр тяжести -геометрия... с -composite.

fmw42 18.03.2024 17:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Самый простой способ сделать это — просто использовать -Gravity с -composite несколько раз, используя Imagemagick.

convert wizard: \( logo: -transparent white \) -gravity center -composite \( rose: -transparent white \) -gravity center -composite merged.png

В качестве альтернативы вы можете вычислить верхние левые углы так, чтобы центры были выровнены, и использовать -set page. Просто вычтите центры каждого из центров изображения мастера. (Если у вас есть Imagemagick 7 и вы используете магию вместо преобразования, вы можете вычислить значения страницы с помощью команды слияния -layers.

convert xc: -format "%[fx:240-320]\n" info:
-80

convert xc: -format "%[fx:320-240]\n" info:
80

convert xc: -format "%[fx:240-35]\n" info:
205

convert xc: -format "%[fx:320-23]\n" info:
297

convert wizard:  \( logo: -transparent white -set page -80+80 \) \( rose: -transparent white -set page +205+297 \) -background white -layers merge +repage merged2.png

Комбинированное решение очень удобно, но выходное изображение имеет размеры только первого изображения, а другие изображения можно обрезать по размеру. Знаете ли вы, как добиться эффекта слияния, при котором выходное изображение будет достаточно широким и высоким, чтобы вместить все изображения, не обрезая ни одно из них?

minseong 19.03.2024 09:00

С композитом этого сделать нельзя. Вам придется использовать -layers merge или -mosaic. Но все они не используют -гравитацию. Вам нужно использовать страницу -set. См. imagemagick.org/Usage/layers/#layers

fmw42 19.03.2024 18:28
Ответ принят как подходящий

===== Отредактировано для TL;DR =====

Попробовав несколько возможных решений для объединения нескольких изображений, включая полные размеры всех изображений, и использования их центров в качестве точки выравнивания, я остановился на этой простой команде, которая будет работать с версиями ImageMagick 6 или 7.

magick -background white ^
   wizard: ( logo: -transparent white ) ( rose: -transparent white ) ^
   -set page -%[fx:s.w/2]-%[fx:s.h/2] -layers merge result.png

Ниже приведен мой оригинальный ответ и изменения. Во многом это сложнее, чем нужно.

====================

Одним из решений ImageMagick v6 для центрирования и объединения нескольких изображений разных размеров является установка геометрии страниц каждого изображения перед объединением. (Более простые решения с использованием IMv7 приведены ниже.) Вот пример синтаксиса Windows CLI, который использует выражения FX IM для расчета размеров и центров...

convert ^
   wizard: ( logo: -transparent white ) ( rose: -transparent white ) ^
   ( -clone 0--1 -layers merge ) ^
   -set page %[fx:u[-1].w]x%[fx:u[-1].h] ^
   -set page +%[fx:u[-1].w/2-(s.w/2)]+%[fx:u[-1].h/2-(s.h/2)] ^
   +delete -background white -layers merge result.png

Сначала он читает изображения и делает необходимые прозрачности.

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

Затем он устанавливает размеры страниц для всех изображений, в данном случае ширину и высоту этого изображения-шаблона.

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

После того, как размеры и расположение геометрии заданы, изображение шаблона удаляется с помощью «+delete», фон становится белым, а слои объединяются с использованием специально заданной геометрии.

СНОВА ОТРЕДАКТИРОВАНО: В ImageMagick v6 использование выражений FX ограничено определенными типами настроек. С IMv7 выражения FX можно использовать практически где угодно.

Эта команда IMv7 просто сбрасывает геометрию подкачки, поэтому точка «0,0» фактически находится за пределами каждого изображения на половину его размеров, а не в левом верхнем углу. Обратите внимание, что настройки страницы — отрицательные числа -%[fx:s.w/2]. Затем «объединение слоев» использует эту геометрию для правильного выравнивания изображений и их выравнивания.

magick -background white ^
   wizard: ( logo: -transparent white ) ( rose: -transparent white ) ^
   -set page -%[fx:s.w/2]-%[fx:s.h/2] -layers merge v7result.png

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

magick -background none -gravity center ^
   wizard: ( logo: -transparent white ) ( rose: -transparent white ) ^
   ( -clone 0--1 -layers merge ) -extent  %[fx:u[-1].w]x%[fx:u[-1].h] ^
   +delete -background white -flatten v7result.png

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

Несмотря на то, что у меня IM7, первая команда работает, но вторая вызывает ошибку: конвертировать: неверный аргумент для опции «-extent»: %[fx:u[-1].w]x%[fx:u[-1] .час]

minseong 20.03.2024 15:17

Ошибка заключается в разнице в том, как IMv6 и IMv7 обрабатывают выражения FX. Большинство операций в версии 6 не понимают конструкцию «%[fx:...]». В IMv7 выражения FX можно использовать практически везде, где бы вы ни использовали значение.

GeeMack 20.03.2024 15:52

Кроме того, когда вы используете IMv7, вам следует использовать просто «магию…». Когда вы используете «magick Convert...», по умолчанию используется поведение IMv6, отсюда и ошибка в использовании выражения FX.

GeeMack 20.03.2024 15:56

Спасибо, для меня причиной стал второй; Я просто использовал convert, что, по-моему, является псевдонимом magick convert.

minseong 21.03.2024 07:01

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