PDA

Просмотр полной версии : как сделать инструмент заливка


Morozov1982
20.06.2006, 09:29
Сейчас работаю над созданием небольшого графического редактора во флэше и встал перед одной небольной проблемой.

Создал разные инструменты: карандаш, разные фигуры и т.п., НО НЕ МОГУ СОЗДАТЬ ИНСТРУМЕНТ ЗАЛИВКА, как во всех нормальных графических редакторах.

Если кто умеет, или есть исходник, большая просьба, МАЯКНИТЕ :)

Король
20.06.2006, 09:33
исходника нет. могу подсказать - все твои фигуры и линии копируй в специальный объект - каждую как массив точек - и по клике ведром определяй, какую из них ты редактируешь - и перерисовывай ее нужным цветом

Morozov1982
20.06.2006, 09:35
Я приблизительно так и думал, но думал, что есть способы попроще.

Король
20.06.2006, 10:03
Я приблизительно так и думал, но думал, что есть способы попроще.
придумай - и будет

iNils
20.06.2006, 11:53
А вы векторный редактор делаете или растровый?

Morozov1982
20.06.2006, 12:12
Я делаю векторный редактор

iNils
20.06.2006, 12:16
Тогда вам стоит продумать другую схему реализации заливки. То есть хранить каждый объект отдельно и перерисовывать его.

Morozov1982
20.06.2006, 12:19
Ну в принципе да, это наиболее оптимальный вариант...

Король
20.06.2006, 12:21
Тогда вам стоит продумать другую схему реализации заливки. То есть хранить каждый объект отдельно и перерисовывать его.
а я что предложил?

iNils
20.06.2006, 12:25
Тем не менее вот пример работы заливки (ему правда уже 2 года, да и код там не ахти)

Morozov1982
20.06.2006, 12:27
Спасибо iNils в который раз уже выручаешь, надеюсь и я когда-нибудь смогу тебе помочь. :)

iNils
20.06.2006, 12:27
А вот еще теория
http://algolist.manual.ru/graphics/fill.php

PS. Забросил я идею с заливкой из-за малой скорости выполнения.

Morozov1982
20.06.2006, 12:36
Теория - это вообще тема, это самое приятное, что я могу получить (не считая исходников конечно :) )

SvTol
04.02.2008, 09:41
исходника нет. могу подсказать - все твои фигуры и линии копируй в специальный объект - каждую как массив точек - и по клике ведром определяй, какую из них ты редактируешь - и перерисовывай ее нужным цветом
массив точек... жестко.
у меня другая идея появилась но как реализовать пока не знаю.
Вобщем примерно так:
1. делаем битмап из картинки
2. Определяем область заливки (берем точку смотрим её цвети смотрим смежные пикселы на предмет совпадения цвета)
3. В другом битмапе рисуем то че нада залить
4. Аттачим к исходному рисунку нарисованные битмап

Ну вобщем как то так... Только пока смутно представляю как смежные пикселы проверять...

flash33
04.02.2008, 11:43
Ищите в гугле, особенно в исходниках Delphi и С, что вы всё велосипед изобретате???

SvTol
04.02.2008, 20:27
исходниках Delphi и С
особенно если не видел ни того ни другого никогда

Я сделал вот так :

// делаем из нарисованого битмап
var holst:BitmapData = new BitmapData(avatar_mc.oblast.width,avatar_mc.oblast.height);
holst.draw(avatar_mc,null,null,null,avatar_mc.oblast);
// заливаем то что надо
holst.floodFill(m_x, m_y, 0x00FF0000);
// делаем ещё один битмап из нарисованного
var ishodnik:BitmapData = new BitmapData(avatar_mc.oblast.width,avatar_mc.oblast.height);
ishodnik.draw(avatar_mc,null,null,null,avatar_mc.oblast);
//сравниваем битмапы
var diffBmpData:BitmapData = holst.compare(ishodnik) as BitmapData;
// а терь заливаем ещё раз
diffBmpData.floodFill(m_x, m_y, pipetka.selectedColor);
//ну а теперь аттачим все это к нарисвоаному
var bm:Bitmap = new Bitmap(diffBmpData);
bm.x=0;
bm.y = 0;
avatar_mc.addChild(bm);

не пашет. почему пока не понял. не работает заливка битмапа...

SvTol
04.02.2008, 20:29
заработало!!!!
косяк был в
var holst:BitmapData = new BitmapData(avatar_mc.oblast.width,avatar_mc.oblast.height, false);

SvTol
04.02.2008, 20:59
вот работающий код:

var holst:BitmapData = new BitmapData(avatar_mc.oblast.width,avatar_mc.oblast.height,false);
holst.draw(avatar_mc,null,null,null,avatar_mc.oblast);
holst.floodFill(m_x, m_y, 0x00FF0000);

var ishodnik:BitmapData = new BitmapData(avatar_mc.oblast.width,avatar_mc.oblast.height,false);
ishodnik.draw(avatar_mc,null,null,null,avatar_mc.oblast);

var diffBmpData:BitmapData = holst.compare(ishodnik) as BitmapData;
var resultat:BitmapData = new BitmapData(avatar_mc.oblast.width,avatar_mc.oblast.height,true);
resultat.draw(diffBmpData,null,null,null,avatar_mc.oblast);

resultat.floodFill(m_x, m_y, 0xFFFF0000);
resultat.floodFill(1, 1, 0x00FFFFFF);


var bm:Bitmap = new Bitmap(resultat);
bm.x=0;
bm.y = 0;
avatar_mc.addChild(bm);

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