LINUX.ORG.RU

Как в imagemagick отмасштабировать изображение с промежутками между пикселями?

 


0

1

Давно не заходил. Неужели у одмина закончилась СВО по деаватаризации ЛОРа? Особенно люто доставляет, когда заходишь на какой авито и видишь там лютейшие аватары, до которых никому нет дела. Но видимо закошмарить ЛОР было куда важнее, чем гешефтную офшорную площадку.

Впрочем простите мне это лирическое отступление, а речь пойдёт об:

Нужно видеть разложение картинки на пиксели.

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

Для примера картинки возьмём:

# Кодировать спрайт Марио в base64 и записать в файл:
magick 'inline:data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAO
xAGVKw4bAAAA00lEQVQ4ja1UwRGDMAyTe7zLJmWUzMoodBO6gHmkhsRWcukVvYID
kiKbiKoqbsTjTjIAmLq7IvXzwGHahJ5sUKBJKKhf3rcVAPB8pZ5BTihyEcxLomuD
Fxhqyryk06WtDZ93LSB+bMqYvBtPBsQYA2FP3YPl2XUIAIpcsCZ5eRM18slvALyL
CoFAu5EApCn7tsbx+hY0U55llmkYG7NefuhzKAVFUv1Mm8L+EgKWa5zDQbIWqiNn
riuvID8g1r4c2Hi6Ghvg6sg/mqEIDv+9v2+/sQ8vtmAvY/Wf0QAAAABJRU5ErkJg
gg==' mario.png

Просто увеличить:

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

convert -scale 1200%  -quality 100 mario.png mario-big.png

и вот хочется, чтобы каждый увеличенный пиксель отстоял от другого на 1px. Как это сделать поизящнее?

Давно не практиковался с im, простых решений в голов не приходит(

★★★

Последнее исправление: hikikomori (всего исправлений: 1)

Если просто «на пальцах»…

-scale 1200%

Значит 12x12 пикселей. Накладываем на это изображение «сетку», с ячейкой 12x12, толщиной 1 пиксель.

andytux ★★★★★
()
Ответ на: комментарий от andytux

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

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

Может вы подскажите, @mydibyje ?

Накладывать отдельную сетку - это её как-то нарисовать ещё нужно, учитывая размеры исходной картинки.

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

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

Декодировать в битмап и тупо вставить «пустые» пиксели между исходными пикселями. Программа уровня «второй день изучения питона»

futurama ★★★★★
()
Ответ на: комментарий от futurama

И получить гигантские отступы размером в пиксель, с которыми потом городить ещё одну итерацию?
А надо где-то так: http://0x0.st/oplX.png

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Ответ на: комментарий от vvn_black

Это вы предлагаете самостоятельно пропарсить весь файл по пикселю, это конечно можно заморочиться, но интересует решение с использованием силы imagemagick. Как насчёт этого?

hikikomori ★★★
() автор топика
Ответ на: комментарий от mydibyje

Спасибо! Уже лучше, очень интересно, почитаю, спасибо! Но это получается отступ равный пикселю и картинка а ля «Газонокосильщик убивает распикселизацией». А надо где-то так: http://0x0.st/oplX.png

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

но интересует решение с использованием силы imagemagick

кмк, без кучи вызовов montage и convert не получить нужный результат, тут уж проще напитонить на Pillow, наверное.

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Мне ещё посоветовали, @mydibyje обратите внимание, такой вариант:

magick 'inline:data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAO
xAGVKw4bAAAA00lEQVQ4ja1UwRGDMAyTe7zLJmWUzMoodBO6gHmkhsRWcukVvYID
kiKbiKoqbsTjTjIAmLq7IvXzwGHahJ5sUKBJKKhf3rcVAPB8pZ5BTihyEcxLomuD
Fxhqyryk06WtDZ93LSB+bMqYvBtPBsQYA2FP3YPl2XUIAIpcsCZ5eRM18slvALyL
CoFAu5EApCn7tsbx+hY0U55llmkYG7NefuhzKAVFUv1Mm8L+EgKWa5zDQbIWqiNn
riuvID8g1r4c2Hi6Ghvg6sg/mqEIDv+9v2+/sQ8vtmAvY/Wf0QAAAABJRU5ErkJg
gg==' -scale 800% -crop 8x8 miff:- | magick montage -background white -geometry +1+1 -tile 20x miff:- mario-result.png

Почти всё как надо! Только отступы 2 пикселя,а не 1, как я хочу.

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Ответ на: комментарий от hikikomori

Ещё рассказали такой вариант

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 JPG:- | display ; rm mario-row-*.png

Результат: http://0x0.st/opnR.png

Почти то, что надо, только временные файлы создаёт и их потом удалять надо. И нельзя указать для рамки оба цвета как white - продают все цвета вообще. Обхожу это указывая на байт меньше: #fffffe Глазу разницы не видно, но почему так, кто скажет?

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 2)
Ответ на: комментарий от vvn_black

Самый крутой вариант подоспел:

convert mario.png \
  -scale 800% \
  -crop 0x8 -splice 0x1 -append \
  -crop 8x0 -splice 1x0 +append \
  -chop 1x1 mario-big4.png
hikikomori ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.