LINUX.ORG.RU

Изучаю возможности ImageMagick - тред #1 графические примитивы

 


0

1

Howdy!

Хочу на холсте нарисовать несколько пикселей.

magick -size 10x6 xc:khaki -fill black -draw 'point 3,2' draw_point.gif
magick -size 10x6 xc:khaki -fill black -draw 'point 3,2 point 1,2' draw_point.gif

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

Нагуглил такой метод:

input.txt

# ImageMagick pixel enumeration: 3,4,255,rgb
0,0  
1,0: (0,0,0)
2,0: (255,255,255)  
0,1: (0,0,0) 
1,1: (255,255,255)   
2,1: (0,0,0) 
0,2: (255,255,255)    
1,2: (0,0,0)        
02,03: (0,0,0)         

Теперь по этому файлу создаём наш пиксель арт:

convert -background tan txt:input.txt -filter point -resize 64x64! output.png

Прекрасно, у меня получилось! Я даже воспылал вдохновением и попробовал нарисовать спрайт Марио. Но не тут-то было. Хотя в документации пишут, что: you do NOT need to define ALL the pixels. на самом деле нельзя описать пиксели с не нулевой x позиции. Нужно построчно слева направо описать, пусть не до правой границы, но если начать новую строку не с первой колонки, то error/convert.c/ConvertImageCommand/3325.

Я попробовал с этим смириться, и описал голову Марио: https://pastebin.com/TyyDSibf

convert -background tan txt:mario.txt -filter point -resize 64x64 mario.png
convert: no images defined `mario.png' @ error/convert.c/ConvertImageCommand/3325.

Даже если бы получилось, то при смене background пришлось бы менять цвет ведущих с начала строки лишних пикселей (да, у меня для теста они 255) и они занимают кучу лишнего места, и не получилось.

ЧЯДНТ?

Помогите plz правильно описать спрайт Марио.

Можно конечно и так:

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

Но эта компиляция неудобна для редактирования точек и я хочу освоить данный инструмент txt:. Но описывать только те точки, что хочу. И желательно не кодами, а именами, которые почему-то не проходят.

Ссылки:

Перемещено hobbit из general

★★★

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

Практический смысл - быстро сваять небольшую иконку в консоли.

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

Но в общем вы правы, это не формат хранения, это формат обработки данных.

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

я аватарки себе генерировал на этом сайте:

convert -resize 128x128^ -gravity Center -crop 128x128+0+0 +repage input.jpg avatar.jpg

кроме этого еще из формата в формат изображения перегонял

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

Да уж, но было это в домаккартистскую эпоху охоты на аватары…

А зачем использовали https://imagemagick.org/script/command-line-options.php#repage ?

Ради этого?

Use +repage to completely remove/reset the virtual canvas meta-data from the images.

В -crop +0+0 Это остатки чего-то другого или зачем?

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

Практический смысл - быстро сваять небольшую иконку в консоли.

много точек в одной строке писать устанешь

графические примитивы

А если попробовать объединить лучшее из миров растровой и векторной графики и написать простейший SVG? Вот пример с хабра:

<svg>  
<line x1="0" y1="0" x2="200" y2="200" stroke-width="1" stroke="rgb(0,0,0)"/>  
</svg>

Тут сразу готовая линия. Можно и фигур посложнее надобавлять, в той же статье есть примеры. Ну да, от «просто текстового файла» это отличается необходимостью открывать и закрывать теги, но можно один раз себе шаблончик наваять и подставлять в него что хочешь по мере надобности.

Нарисовал столько линий, сколько надо, думаю, svg и заливку позволит сделать (если нам для иконки) и конвертнул svg в растр любой подходящей программулиной. Гугл подсказывает, что это и imagemagick с доп.пакетами может.

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

Формат xpm мне очень понравился. А вот svg без особой нужды применять не хочется, тем более для пиксель арта. Да и не люблю иерархический xml, тэги, куча мусора, читать неудобно.

curl -O https://www.w3.org/TR/SVG/images/paths/triangle01.svg

cat triangle01.svg 
<?xml version="1.0" standalone="no"?>
<svg width="4cm" height="4cm" viewBox="0 0 400 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <title>Example triangle01- simple example of a 'path'</title>
  <desc>A path that draws a triangle</desc>
  <rect x="1" y="1" width="398" height="398"
        fill="none" stroke="blue" />
  <path d="M 100 100 L 300 100 L 200 300 z"
        fill="red" stroke="blue" stroke-width="3" />
</svg>

А концепция path мне нравится, но для применения напрямую в im:

# Нарисовать ТРЕУГОЛЬНИК
magick -size 300x300 xc:black -strokewidth 8 -stroke white -fill red -draw "path 'M 50,70 L 240,70 L 150,250 Z'" triangle.gif
hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

А теперь другая трабла - хочу сгенерированное одной командой изображение отредактировать другой, но последняя просто перезаписывает входящий файл. Пробовал разные методы, не получается. Как?

ВОПРОС: Как наложить генерируемое изображение ПОВЕРХ имеющегося во входящем файле?

Неудачные попытки:

 magick -size 500x500 xc:none -draw "image over 0,0 0,0 'circle.gif'" -draw "image over 100,100 0,0 'pentagram.gif'" penta-circle.gif

magick pentagram.gif -strokewidth 8 -stroke white -draw "circle 248,248  110,60" pentaincircle.gif

magick gif:pentagram.gif -strokewidth 8 -stroke white -draw "circle 248,248  110,60"  pentaincircle.gif

hikikomori ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.