LINUX.ORG.RU

генерация пиксельной плитки средствами imagemagick - как сделать...

 


0

1

Привет!

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

Есть ТЗ:

нарисовать прямоугольник длиной X и высотой Y пикселей, допустим 15х500. И залить его разными спокойными оттенками зелёного. не вырвиглазного спектра.

То есть нужна полоска пикселейта с рандомным отличием по оттенку соседних пикселей. Потом я её масштабирую и получаю пиксельарт для оформления.

Как это можно сделать скриптом?

нужно нагенерировать полосок, но мозг занят другим, помогите пожалуйста. Помню, в мануале где-то в его дебрях было такое, но не помню где… В моих конспектах нашёл всё, кроме этого)

Вот например :

magick -size 500x15 xc: +noise Random  JPG:- | display
magick -size 500x15 xc: -attenuate 0.5 +noise Random  JPG:- | display
magick -size 500x15 xc: +noise Random -modulate 200,210,150 JPG:- | display

но это рандомный шум, а мне нужно задать например green, и чтобы были только его оттенки, причём в заданом по rgb диапазоне

Вот пример2 :

magick -size 1x1 xc:White -fx "u*rand()" -evaluate Divide "%[fx:maxima]" \( +clone xc:White -compose blend -define compose:args=60 -composite \)  -scale 100x100 +append JPG:- | display

но получается только два квадратика, и как подстроить под мои нужды, непонятно.

★★★

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

но это рандомный шум, а мне нужно задать например green, и чтобы были только его оттенки, причём в заданом по rgb диапазоне

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

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

Для плитки просто берите шум низкого разрешения или квантуйте постфактум. Шумите в грейскейле и потом перемножайте с интерсивностью оригинального цветного цвета.

Честно хз про cli, я IM как либу использую.

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

накидал скрипт на питоне, вот что получилось: https://0x0.st/XycV.mp4 (видео наверное надо скачать, у меня в браузере такой файл не проигрывает, так как он в формате libx264rgb).

параметры распределения: https://0x0.st/XycW.png

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

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

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

к сожалению скрипт не сохранился. да там ничего сложного: генерируешь три случайных значения, каждое со своими мю и сигма и конвертишь в rgb. на чистом питоне медленно получается, так как каждый пиксел генерировался в цикле. лучше на сишке написать или хотя бы на нумпае. на imagemagick’е я не знаю как это сделать. наверное можно попробовать наложить на определённый цвет цветной шум, с какой-то прозрачностью. должно тоже получиться.

за 2к в биткоинах могу повторить скрипт)

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

Я хочу именно в однострочном скрипте в баше. Варианты с питоном и прочие к сожалению не интересны. Хочется прокачать именно простой терминальный вариант силами утилит im в пределах bash.

Вот например вместо этого компактного быстрого решения:

magick mario.png -scale 900% \( +clone -colorspace gray -fx "(i % 9 == 0 | j % 9 == 0) \
? 1.0 : 0" \) -compose lighten -composite mario-big7.png

мне тоже предлагали писать многострочные скрипты

#!/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

Каждый раз, когда я вижу короткое изящное решение сложной задачи, я любуюсь этим как произведением искусства. Жаль, у нас нет сообщества по изучению IM.

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

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

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

# база:
# magick -size 25x25 xc:\#57b36dff -colorspace HSL -channel H -evaluate gaussian-noise 0.7 -channel S -evaluate gaussian-noise 2 -channel L -evaluate gaussian-noise 1 -scale 250 img.png

# читаемый вариант:
magick -size 25x25 xc:\#57b36dff -colorspace HSL \
    -channel H -evaluate gaussian-noise 0.7 \
    -channel S -evaluate gaussian-noise 2   \
    -channel L -evaluate gaussian-noise 1   \
    -scale 250 img.png

результат: https://0x0.st/Xy5o.png (круче, чем в майнкрафте:)

оплачивать сюда: 15jAZcn7gWwN8cAeZqrZbNh6yiVtFKVBTK

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

Как вы точно про уродца сказали. Та же фигня. Сколько не изучал, довольно плотно убивая дни исключительно в мануалах IM и написании примеров (в рисовании примитивов неплохо освоился), но каждый раз, когда нужно для конкретной задачи, словно и не было ничего этого.

Питон я знаю, но ни разу в нём не пробовал, меня привлекает возможность скопипастить одну строку и сразу исполнить.

Результат красивый. Биткоинами к сожалению не пользуюсь. Вы меня немного в неловкое положение поставили, согласия на 2К за пример я не давал, но если будет угодно, готов задонатить 666руб. скажите только как.

upd: на другом портале ещё писал, тоже такое решение подсказали с вариациями.

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

Спасибо. Признаю, самый наглядный) Для изучения принципов работы мне все три варианта окажут незаменимую помощь. И главное, цель достигнута, и получена ещё одна IM ачивка.

А случаем не знаете, как в качестве фона при рисовании примитивов использовать предыдущее изображение? Я помнится так и не научился, пришлось всё рисовать в одну итерацию. Вот например плод изучения манов:

# Нарисовать АНКХ на радиальном фоне, используя кривые Безье и путь координат прямых:

magick -size 300x600  radial-gradient:pink1-Red1 -strokewidth 22 -stroke black -fill none -draw "bezier 155,27 20,40 110,218 150,270" -draw "bezier 154,27 280,40 190,218 149,270" -strokewidth 3 -fill black -draw "path 'M 10,255 150,266 290,255 290,300 162,286 172,561 127,561 137,286 10,300 10,255 '"  ankh-by-bezier-a.gif
hikikomori ★★★
() автор топика
Ответ на: комментарий от anonymous

Спасибо за пример, делаю подпись на картинке:

magick ankh-by-bezier-a.gif -fill white -gravity center -font Arial -pointsize 72 -draw "text 0,0 'Ta Kemet'" JPG:- | display

Но меня бесит новый синтаксис IM, почему я не могу как раньше, указывать имена файлов после ключей? Так удобно было выносить в начало строки самое важное:

magick -fill white -gravity center -font Arial -pointsize 72 -draw "text 0,0 'Ta Kemet'" ankh-by-bezier-a.gif JPG:- | display

А теперь ошибка.

не совсем понятно

Я при рисовании примитивов рисую их на холсте, допустим xc:black Но хочу вместо холста использовать предыдущее сгенерированное изображение, и не знаю, как это сделать.

Думал это можно в концепции холста, xc:./filename но нет.

Как я понял, использовать новый синтаксис, сперва имя входящего файла, операции, выходящий. Только так вроде?

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

почему я не могу как раньше, указывать имена файлов после ключей?

а разве не всегда так было? в mogrify список файлов после ключей пишется. попробуй вместо magick писать convert. я хз.

anonymous
()
Ответ на: комментарий от anonymous
  1. Раньше был выбор. Потом они повернулись на унификации синтаксиса.
  2. Это невозможно, конверт остался видимо только как затычка с объявлением:

WARNING: The convert command is deprecated in IMv7, use «magick»

И срабатывает только какая отладочная мелочь вроде:

convert rose: JPG:- | display

convert -size 100x100 canvas:OrangeRed canvas.gif
...
hikikomori ★★★
() автор топика