LINUX.ORG.RU

ImageMagick. Можно ли...


0

0

Есть картинка. Сначала ее обрабатываю ImageMagick'ом - shave,negate, composite -compose difference... В общем в итоге получается рисунок - черный фон, а на нем белые фигуры в ряд. Для простоты допустим что идут круг, квадрат, треугольник.

Можно ли ImageMagick'ом разбить рисунок на 3 - с кругом, квадратом и треугольником?

Пока в голову лезет что-то наподобие такого: пробегаем по рисунку, черный фон не трогаем, а как только находим белый пиксель - закрашиваем его в определенный цвет (допустим сначала красный,потом зеленый,потом синий). После 'пробега' на рисунке будут красный круг, зеленый квадрат и синий треугольник. Потом вырезать все красное, потом зеленое, потом синее - сохраняя при этом в разные файлы... Только как это все сделать ? И можно ли ImageMagick'ом делать такое?

★★★★★

> черный фон, а на нем белые фигуры в ряд.

пробегаем по рисунку (2d массив), ищем черные вертикальные линии -- это черные промежутки между картинками по ним (коорд. этих промежутков) нарезаем на картинки ImageMagick'ом

sdio ★★★★★
()

Ну это да, я так и хочу сделать. А как в ImageMagick'е все это реализовать - проверку пикселей на цвет, условия, цикл и тд. ?

kovrik ★★★★★
() автор топика

ну PerlMagick, RMagick и тд. - какая разница? все равно ж тот же ImageMagick... а как в нем это реализовать?

kovrik ★★★★★
() автор топика

Вариант такой - предположим, что фигуры (произвольной формы) залиты одним цветом.

Если Вы можете попасть хоть в 1 пиксель фигуры, то вырезать ее в отдельный файл это две команды:

convert <исходная_картинка> -fill none -draw "matte координа_X,координата_Y floodfill" -fill white -colorize 100% tmp.gif

convert <исходная_картинка> tmp.gif -composite -trim +repage <картинка_с_одной_формой>

Основная проблема попасть хоть в 1 пиксель не фонового цвета. Ща надо прикинуть какбэ так похитрому пиксели повыбирать...

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

>Основная проблема попасть хоть в 1 пиксель не фонового цвета. Ща надо прикинуть какбэ так похитрому пиксели повыбирать...

Придумал!

Итак у нас есть три произвольные формы залитые черным цветом на белом фоне. Я тут по пунктам попишу (Вы уж не судите строго ;), чтобы не запутаться, а уж длинные конвееры понаделать всегда успеется. Промежуточные результаты будут в файлах 1.gif, 2.gif и т.д.

1. Сначала на всю картинку добавляем булую рамку, чтобы гарантировать, что никакая форма границы картинки не касается:

convert test1.gif -bordercolor white -border 10x10 1.gif

2. Потом подрежем картику только слева до касания с самой левой формой

convert 1.gif -gravity East -background blue -splice 1x0 -background red -splice 1x0 -trim +repage -chop 1x0 2.gif

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

convert 2.gif -gravity West -background black -splice 1x0 3.gif

4. Теперь можно резать (как я уже писал) - координаты-то мы уже знаем. Пойдет любая точка в крайнем левом столбце, к примеру, (0;0).

convert 3.gif -fill none -draw "matte 0,0 floodfill" -fill white -colorize 100% 4.gif

convert 3.gif 4.gif -composite -negate 5.gif

5. Убираем лишнее, а именно добавленную вертикальную полосу.

convert 5.gif -gravity West -chop 1x0 -trim +repage форма_1.gif

6. На картнке 3.gif нужно залить цветом фона (белым) по шаблону (по маске) из 4.gif уже вырезанную фигуру.

// Ну это домашнее задание - думаю справитесь ;)

7. Повторить с пункта номер 2 все действия еще два раза для оставшихся двух фигур.

// Это тоже на дом ;)

В общем, я попробовал - работает. Задача пусть не элегантно, но решена - я пошел спать.

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

Вторая команда чет не работает... Вместо подрезания картинки слева до касания фигуры - по центру рисует здоровую красную полосу с толстой синей рамкой - рисунок в 2 раза увеличивается по высоте...

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

>Вместо подрезания картинки слева до касания фигуры - по центру рисует здоровую красную полосу с толстой синей рамкой - рисунок в 2 раза увеличивается по высоте...

опция gravity правильно написана? На своем месте?

А скопируйте сюда дословно, то что пишете (прям из терминала).

Bebop ★★
()

Пишу bash'евский скрипт, который обрабатывает изображение. Вот второй пункт:

convert $input -gravity East -background blue -splice 1x0 -background red -splice 1x0 -trim +repage -chop 1x0 $input_2

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

Может не работает из-за того, что картинки из-за jpeg'а получаются немного размытыми - граница черного и белого не резкая, а с серым градиентом...?

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

>Пишу bash'евский скрипт, который обрабатывает изображение. Вот второй пункт:

>convert $input -gravity East -background blue -splice 1x0 -background red -splice 1x0 -trim +repage -chop 1x0 $input_2

Вы меня обманываете! Расскажите как splice может нарисовать горизонтальную полосу если Вы ему передали параметр 1x0, а не 0x1!!!

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

>Может не работает из-за того, что картинки из-за jpeg'а получаются немного размытыми - граница черного и белого не резкая, а с серым градиентом...?

А вот для этого придумали опцию -fuzz <проценты>

Она нужна для выбора близких цветов.

Bebop ★★
()

Насчет splice - я просто скопировал вашу строчку и заменил названия файлов...

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

Вот такая команда (я еще fuzz добавил)

convert rounda.jpg -gravity East -background blue -splice 1x0 -background red -splice 1x0 -fuzz 25% -trim +repage -chop 1x0 rou ndb.jpg

Дает вот такую картинку http://img190.imageshack.us/img190/6418/roundb.jpg

ЧЯДНТ?

ЗЫ Я это проверил даже на винде в цигвине.

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

T_T

Тупо скопировал вашу команду - все равно не работает. Опять полосы синего и красного цвета... А у вас какая версия imagemagick'а? У меня ImageMagick 6.5.4-6 2009-08-21 Q16 OpenMP. Может там поломали они чего...

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

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

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

ЗЫ А что есть проблемы с апгрейдом-даунгрейдом?

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

Есть еще вариант - разбейте команду на несколько:

1. Добавте верт. полосы слева

2. Отдельно trim и repage

3. Отдельно chop

Вот это что дает? convert rounda.jpg -gravity East -background blue -splice 10x0 -background red -splice 10x0 tmp.jpg

А еще покажите вывод convert -list gravity

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

Нашел, добиться того, что у Вас:

convert rounda.jpg -gravity East -background blue -splice 10x10 -background red -splice 10x10 tmp.jpg

Т.е. это опции сплайса. Похоже, что 10x0 не катит и он подменяет ноль на что-то другое.

Вариант: 10х0 надо писать в кавычках! Попробуйте, пожалуйста.

Почитайте систаксис для геометрии у сплайса в Вашей версии ImageMagick-а.

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

Кавычки не помогают. Синтаксис - сейчас почитаю.

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

Еще можно писать вот так -splice 10x0!

С восклицательным знаком - тогда он будет игнорировать соотношение сторон (по умолчанию, IM пытается его сохранить).

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

Обновился - помогло ;D Теперь нормально обрезает с левого края. Позже попробую остальные шаги, отпишусь работает ли. Большое спасибо!

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

>Обновился - помогло ;D Теперь нормально обрезает с левого края.

Ну и славненько. Хотя от IM не ожидал, что будут ломать стандартные вещи.

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

Правда где-то на шаге 4м (или 5м) опять что-то не работает...

Пишет convert: geometry does not contain image `rounda5.jpg' @ statistic.c/GetImageBoundingBox/237.

При этом rounda4.jpg - полностью белый, rounda5.jpg - наоборот черный (все без фигур). А на выходе получается 1 пиксель =)

В общем позже вернусь, буду опять пытать этот imagemagick...

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

>Правда где-то на шаге 4м (или 5м) опять что-то не работает...

Дык, у Вас там жопег кругом! Понятно, что все не просто так - добавляйте -fuzz XX%

В общем, пишите, если что.

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