Вопрос

Хорошо, поэтому я постараюсь быть как можно более описательным.

Я работаю над проектом для клиента, которому требуется функция маскировки загруженного изображения в стиле jibjab.

Я хотел бы иметь возможность сгенерировать объект для хранения в базе данных, который содержит позиции привязки / управления в форме Безье, чтобы я мог извлечь его позже и повторно замаскировать объект.Все это довольно легко сделать, за исключением одной загвоздки :Мне нужно создать объект Безье из нарисованного пользователем контура.

Пока что вот как я представляю себе этот процесс:

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

при перемещении мыши проведите линию по координате XY.

при наведении курсора мыши вверх, завершите заполнение.

Все это работает просто великолепно.Я мог бы просто сохранить информацию здесь, но я бы смотрел на ГИГАНТСКИЙ объект, полный тонн довольно бесполезных координат x / y, и у меня не было бы возможности внести изменения в тонкую настройку, кроме как наложить маркеры на каждый пиксель.(С таким же успехом я могу дать конечному пользователю инструмент для рисования карандашом ...)

Вот что я думаю о вычислении кривой Безье :

1:Выясните, когда мне нужно начать новую кривую, и отследите xy пикселя на этом интервале.Я представляю, что это просто количество пикселей, может быть, просто увеличивайте переменную count за каждое движение мыши и создавайте новую каждые x пикселей.Проблема здесь в том, что некоторые кривые были бы неточными, а другие ненужными, но мне действительно просто нужна общая область, а не точное представление, чтобы это могло сработать.Хотя я был бы счастлив с чем-то немного более умным.

2:возьмите каждый новый x / y, сохраните его как привязку и выясните, куда будет направлен элемент управления, чтобы сделать линию кривой между этим и последним привязкой.вот тут-то я по-настоящему и зацикливаюсь.Я уверен, что кто-то сделал это во flash, но, похоже, никакое количество поисковых запросов в Google не может помочь мне с тем, как это сделать.Я сделал много набросков и те небольшие математические выкладки, которые смог осмыслить, но, похоже, не могу придумать способ преобразования пикселей в формат безье.

Возможно ли это?Все, что мне действительно нужно, - это что-то, что будет приближено к той же форме.Я подумываю о том, чтобы, возможно, размещать привязки только тогда, когда угол следующего пикселя превышает 180 градусов по отношению к текущей линии или что-то в этом роде, и просто захватить край дуги между этими изменениями, но как бы я ни старался, я, кажется, не могу понять, как заставить это работать!

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

Джесси

Это было полезно?

Решение 3

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

Прямо сейчас у меня есть базовый обходной путь, я просто считаю перемещения мыши, затем при каждом перемещении X (играя с ним, чтобы получить наиболее желаемую кривую) я захватываю позицию xy.затем я беру все остальные сохраненные xy и превращаю их в якорь, остальные xy превращаются в элементы управления.Это дает несколько желаемых результатов, но имеет некоторые незначительные проблемы, заключающиеся в том, что скорость, с которой рисуется маска, влияет на количество маркеров, и на самом деле получается просто общая область, а не точное соответствие.Интересно, что пользователи, похоже, рисуют медленнее для получения более точных фигур, так что это решение работает намного лучше, чем я себе представлял, но оно не так приятно, как могло бы быть.Это сработает для клиента, поэтому, хотя нет причин заниматься этим дальше, мне нравится изучать новые вещи, и я потрачу некоторое свободное время на изучение линейных уравнений наименьшего размера и посмотрю, смогу ли я создать класс, который будет выполнять эти вычисления за меня.Если кто-нибудь наткнется на какой-нибудь AS3-код для такого рода вещей или захочет что-нибудь из моего, дайте мне знать, это интересная головоломка.

Другие советы

Похоже, потребуется много работы, чтобы превратить пиксели в кривые Безье.Вы могли бы попробовать использовать что-то вроде линейного алгоритма наименьших квадратов. http://en.wikipedia.org/wiki/Linear_least_squares

Другой такт, не могли бы вы попросить своих пользователей рисовать векторную графику вместо этого?Таким образом, вы можете просто сохранить фигуры в базе данных.

Другим классным методом преобразования растра в вектор было бы что-то вроде этой итеративной программы: http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

Удачи

В моем ответе на этот вопрос Я обсуждаю использование автотрасса чтобы преобразовать растровые изображения в формат безье.Я рекомендую передать ваш пользовательский рисунок через эту программу на сервере.Autotrace выполняет фантастическую работу по отслеживанию и упрощению, поэтому здесь нет необходимости пытаться изобретать велосипед.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top