Увлёкся спрайтами из восьмибитных игр, Привет рисующим в тетрадке в клетку и вышивающим крестиком!
Итак возник вопрос, как отмасштабировать изображение так, чтобы пиксели были не только без
блюра, но и с отступом между друг-другом в N реальных пикселей?
Половина работы сделана, маленький спрайт увеличен. осталось разбить его на пиксели по сетке. И тут решений может быть много и не все они простые и верные...
Следующее найденное решение, за небольшим исключением, было почти приемлемым, почти потому, что отступы между пикселями составляли не 1, а 2 пикселя:
convert mario.png -scale 800% -crop 8x8 miff:- | \
magick montage -background white -geometry +1+1 -tile 20x \
miff:- mario-big3.png
Наконец приемлемое рабочее решение было найдено. Пусть в нём не всё идеально, но на настоящее время лучшего нет. Минусы - создаёт кучу временных файлов, которые приходится в конце удалять. И обратите внимание на цвет накладываемой сетки - он не белый по фону, а почти белый: #FFFFFE. Сделал так потому, что при указании обоих цветов как white, портится цветовая палитра изображения. К счастью разница между ff и fe на глаз почти не заметна.
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-big4.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 mario-big4.png
UPD.
Сразу после публикации этого поста мне прислали ещё один вариант, короче, лучше:
convert mario.png -scale 800% -crop 0x8 -splice 0x1 -append \
-crop 8x0 -splice 1x0 +append -chop 1x1 mario-big5.png
Рассмотрим этот пример подробнее:
convert mario.xpm \
-scale 800%
-crop 0x8 -splice 0x1 -append
-crop 8x0 -splice 1x0 +append
-chop 1x1
JPG:- | display
Если кратко:
- Масштабирование;
- Нарезка на горизонтальные полоски высотой 8px, добавление пустых линий сверху каждой полосы, соединение;
- Нарезка на вертикальные полоски длиной 8px, добавление пустых линий слева каждой полоски, соединение;
- Удалить 1px по горизонтали и вертикали. Необязательно;
- Отобразить результат вместо сохранения. Иначе вписать имя файла.
Подробный разбор:
-scale — масштабирование изображения, увеличиваем изображение в 8 раз с помощью команды -scale 800%.
-crop — эта команда нарезает изображение на куски указанного размера. Если передаем 0 в качестве ширины, то берется максимальная ширина. То есть -crop 0x8 нарежет изображение на горизонтальные полоски размера 160x8.
-splice — добавление строк или колонок в указанное место. В данном случае команда -splice 0x1 добавит пустую полоску размера 160x1 в начало изображения. Эта команда применяется к каждому куску из предыдущего шага.
-append — этой командой соединяем модифицированные изображения с предыдущего шага в одно изображение. Изображения соединяются друг за другом по вертикали, на это указывает минус перед командой.
Далее аналогично применяются -crop и -splice, но изображение нарезается по вертикальным полоскам.
+append — соединяет изображения в горизонтальном направлении.
-chop — операция, противоположная splice, удаляет указанные строки и столбцы. Команда -chop 1x1 удалит столбец и строку по 1 пикселю в начале изображения.
UPD.
Ещё решение от Mark Setchell and Co. Обратите внимание на -scale 900% если оно подобрано неверно, сетка наложится криво.
magick mario.png -scale 900% -fx "(i % 9 == 0 | j % 9 == 0) ? 1.0 : u" mario-big6.png
Более длинный вариант с композицией готовой сетки и изображения:
magick mario.png -scale 900% \( +clone -colorspace gray -fx "(i % 9 == 0 | j % 9 == 0) \
? 1.0 : 0" \) -compose lighten -composite mario-big7.png
А давайте проверим это решение на на Mario, а на изображении чуть другого размера, логотипе Commodore64:
magick 'inline:data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///8AAAAAAP//AACY
ETBRAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+YJDQwTMySWMXMA
AACrSURBVCjPvdG7EYMwDAZg6Q5Sq4GCadzQuzAZgiW8Ak02SAp7mgyTlnOgQPzy5VKkiO5cfH5I
tkz0pwiILrkTPOflVJ9RM4oz6mI01LrepqBJHluNpFq2cVc50vq8b9pnQIlAXUDF1ag4yBnLE+rF
8oK7xLJ+vOfw5X327bYvVc9sP22vq3/A4MCB2kMNN0xynBTvvXOqUaaWVE5YPKx5TwLnRl2zOW29
X+INcS1PO2ecylIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMDktMTBUMTc6MDU6MTgrMDA6MDCC
OZt/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA5LTEwVDE3OjAxOjMzKzAwOjAwuq3QPgAAACh0
RVh0ZGF0ZTp0aW1lc3RhbXAAMjAyMi0wOS0xM1QxMjoxOTo1MSswMDowMFr2cZoAAAAASUVORK5C
YII=' c64logo.png
magick c64logo.png -scale 900% -fx "(i % 9 == 0 | j % 9 == 0) ? 1.0 : u" c64logo-big1.png
Использованные ссылки:
- https://stackoverflow.com/questions/73590651/
- https://ru.stackoverflow.com/questions/1445266/