Меню сайта
   Главная   
   Обо мне   
   Статьи   
   Дневник   
   Картинки   
   Файлы   
   Форум   
   Гостевая книга   

Категории раздела
Куклы и игрушки [60]
Личное [116]
Музыка [19]
Общее [303]
Японский язык [12]
ZX Spectrum [70]
Субмарины [98]
Настольные игры [34]
Го (碁) [11]
Книги [16]
Япония [26]
Таро [4]
Запертый шкаф [17]
CSA (КША) [15]
GNU/Linux [134]
Ubuntu [103]
Manjaro Linux [39]
Python [3]
Магнитольное [44]
Commodore64 [14]
Игровые приставки [2]


 
Дневник (2022 » Сентябрь » 3 в 00:39)
GNU/Linux Плиточное масштабирование спрайтов в imagemagick

Увлёкся спрайтами из восьмибитных игр, Привет рисующим в тетрадке в клетку и вышивающим крестиком!

Итак возник вопрос, как отмасштабировать изображение так, чтобы пиксели были не только без блюра, но и с отступом между друг-другом в N реальных пикселей?
Для удобства  прилагаю файл, с которым можно будет проверить решения ниже:
# Кодировать спрайт Марио в base64 и записать в файл:
magick 'inline:data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAO
xAGVKw4bAAAA00lEQVQ4ja1UwRGDMAyTe7zLJmWUzMoodBO6gHmkhsRWcukVvYID
kiKbiKoqbsTjTjIAmLq7IvXzwGHahJ5sUKBJKKhf3rcVAPB8pZ5BTihyEcxLomuD
Fxhqyryk06WtDZ93LSB+bMqYvBtPBsQYA2FP3YPl2XUIAIpcsCZ5eRM18slvALyL
CoFAu5EApCn7tsbx+hY0U55llmkYG7NefuhzKAVFUv1Mm8L+EgKWa5zDQbIWqiNn
riuvID8g1r4c2Hi6Ghvg6sg/mqEIDv+9v2+/sQ8vtmAvY/Wf0QAAAABJRU5ErkJg
gg==' mario.png

NOTE: Кстати вот обратное преобразование, чтобы создать из файла код base64:
convert mario.png PNG:- | base64

Теперь этот маленький спрайт нужно увеличить. Однако, при простом увеличении пиксели размазываются. Для точного увеличения следует использовать ключ -scale вместо -resize:

convert -scale 1200%  -quality 100 mario.png mario-big.png
Половина работы сделана, маленький спрайт увеличен. осталось разбить его на пиксели по сетке. И тут решений может быть много и не все они простые и верные...

Например это решение просто добавляет между пикселями изображения по пустому промежутку в пиксель. При дальнейшем масштабировании такой картинки получается жертва мести Газонокосильщика, а не Марио:
convert mario.png -background White -crop 0x1 -splice 0x1 \
-append -chop 0x1 -crop 1x0 -splice 1x0 +append -chop 1x0 \
mario-big2.png

Следующее найденное решение, за небольшим исключением, было почти приемлемым, почти потому, что отступы между пикселями составляли не 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

Спасибо за пищу для ума юзеру Mark Setchell со стековерфло.

UPD.
Сразу после публикации этого поста мне прислали ещё один вариант, короче, лучше:

convert mario.png -scale 800% -crop 0x8 -splice 0x1 -append \
-crop 8x0 -splice 1x0 +append -chop 1x1 mario-big5.png

Спасибо юзеру  Vadik с с русского стековерфло.


Рассмотрим этот пример подробнее:

convert mario.xpm \
  -scale 800%
  -crop 0x8 -splice 0x1 -append
  -crop 8x0 -splice 1x0 +append
  -chop 1x1
  JPG:- | display

Если кратко:
  1. Масштабирование;
  2. Нарезка на горизонтальные полоски высотой 8px, добавление пустых линий сверху каждой полосы, соединение;
  3. Нарезка на вертикальные полоски длиной 8px, добавление пустых линий слева каждой полоски, соединение;
  4. Удалить 1px по горизонтали и вертикали. Необязательно;
  5. Отобразить результат вместо сохранения. Иначе вписать имя файла.

Подробный разбор:

-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

Использованные ссылки:
  1. https://stackoverflow.com/questions/73590651/
  2. https://ru.stackoverflow.com/questions/1445266/


Категория: GNU/Linux | Просмотров: 326 | Добавил: harushima | Теги: ImageMagick | Рейтинг: 0.0/0 |
Всего комментариев: 1.

04.09.2022 21:36
1 harushima
0  
Изучить

convert -size 100x100 canvas: -fx "i % 9 == 1 | j % 9 == 0" JPG:- | display

https://imagemagick.org/script/fx.php

В целях защиты от спама, добавлять комментарии могут только зарегистрированные пользователи. Если Вы не хотите регистрироваться под своим именем, войдите под логином: anonymous, паролем: anonymous.   ( Регистрация,   Вход).
Авторизация
Анонимный вход:
anonymous / anonymous
Логин:
Пароль:

Календарь
«  Сентябрь 2022  »
ПнВтСрЧтПтСбВс
   1234
567891011
12131415161718
19202122232425
2627282930

Поиск

Облако тэгов
JGSDF игрушки Брюнетки Кладбище сайты Ярость Дракулы Древний Египет девушки кошки Cthulhu Вампиры Kitsune Ужас Аркхема инструмент комиксы Lovecraft готика Submarine submarine rc toy Hosting игротека Ужас Аркхэма book uboat мобильная связь го Edgar Poe swf Mansions of Madness Nightmares персоны Synergy linux-hardware bash youtube Storages Python Мастер-рукожоп Магнитофоны Entropy Grub2 loglevel WiFi Beeline ОПСОСЫ sharp939 Аудиокассеты Windows linuxwork Хочуны ImageMagick топБарыг C64c Commodore

Статистика
Яндекс.Метрика
Онлайн всего: 1
Гостей: 1
Пользователей: 0

Page QR code


Перепечатка материалов сайта без активной ссылки запрещена. Следить за RSS
(c) hermitlair.ucoz.com 2009-2024
Лучший браузер!
Блокировка рекламы