Как в imagemagick отмасштабировать изображение с промежутками между пикселями?
Есть маленький спрайт:
# спрайт Марио в base64 записать в файл:
magick 'inline:data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAO
xAGVKw4bAAAA00lEQVQ4ja1UwRGDMAyTe7zLJmWUzMoodBO6gHmkhsRWcukVvYID
kiKbiKoqbsTjTjIAmLq7IvXzwGHahJ5sUKBJKKhf3rcVAPB8pZ5BTihyEcxLomuD
Fxhqyryk06WtDZ93LSB+bMqYvBtPBsQYA2FP3YPl2XUIAIpcsCZ5eRM18slvALyL
CoFAu5EApCn7tsbx+hY0U55llmkYG7NefuhzKAVFUv1Mm8L+EgKWa5zDQbIWqiNn
riuvID8g1r4c2Hi6Ghvg6sg/mqEIDv+9v2+/sQ8vtmAvY/Wf0QAAAABJRU5ErkJg
gg==' mario.png
Я хочу отмасштабировать его в 8 раз:
convert -scale 800% -quality 100 mario.xpm mario-big.png
Но отмасштабировать нужно с отступами между пикселями. Чтобы между четырьмя соседними увеличенными в 8х раз пикселями был отступ в 1 пиксель. Либо наложить поверх сетку цвета фона с учётом размеров исхоного спрайта.
Как можно это сделать, подскажите пожалуйста?
Пример того, что я хочу увидеть:
Ответы (2 шт):
Эту задачу можно решить с помощью следующей команды:
convert mario.png \
-scale 800% \
-crop 0x8 -splice 0x1 -append \
-crop 8x0 -splice 1x0 +append \
-chop 1x1 output.png
Если исходное изображение было 20x20 пикселей, то на выходе получим изображение размером 179x179:
Разберем по шагам:
-scale— масштабирование изображения, увеличиваем изображение в 8 раз с помощью команды-scale 800%.-crop— эта команда нарезает изображение на куски указанного размера. Если передаем0в качестве ширины, то берется максимальная ширина. То есть-crop 0x8нарежет изображение на горизонтальные полоски размера 160x8.-splice— добавление строк или колонок в указанное место. Команда-splice 0x1добавит полоску размера 160x1 в начало изображения. Эта команда применяется к каждому куску из предыдущего шага.-append— этой командой соединяем модифицированные изображения с предыдущего шага в одно изображение. Изображения соединяются друг за другом по вертикали.- Далее аналогично применяются
-cropи-splice, но изображение нарезается по вертикальным полоскам. +append— соединяет изображения в горизонтальном направлении.-chop— операция, противоположная splice, удаляет указанные строки и столбцы. Команда-chop 1x1удалит столбец и строку по 1 пикселю в начале изображения.
Мне ещё так советовали с циклом:
magick mario-big.png -crop x8 mario-row-%02d.png ; for f in mario-row-*png ; \
do echo $f; magick "$f" -crop 8x -background "#fffffe" +smush 1 "$f"; done ; \
magick mario-row-*png -background "#fffffe" -smush 1 mario-big3.png ; rm mario-row-*.png
Это же подробнее bash-скриптом:
#!/bin/bash
# Chop into rows, each row being 50px tall
magick artistic-swirl.jpg -crop x50 row-%02d.png
# Iterate over rows, chopping each into 50px wide chunks and recombining with 1px spacing
for f in row-*png ; do
echo $f
magick "$f" -crop 50x -background yellow +smush 1 "$f"
done
# Smush the new rows together vertically with 1px spacing
magick row-*png -background cyan -smush 1 result.png
Почти то, что надо, только временные файлы создаёт и их потом удалять надо. И нельзя указать для рамки оба цвета как white - продают все цвета вообще. Обхожу это указывая на байт меньше: #fffffe Глазу разницы не видно, но почему так, кто скажет?
Подробности тут: https://stackoverflow.com/questions/73590651/i-want-to-scale-the-sprite-8x-with-padding-between-pixels
