PDA

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


Offi
05.06.2009, 00:07
Доброго времени суток всем!

Столкнулся с задачей: в битмапе необходимо сделать заливку области ограниченой другим цветом. Тоесть как в пеинте ведро. Для этого использую такой код:

import flash.display.BitmapData;

var myBitmapData:BitmapData = BitmapData.loadBitmap("btm2");
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());

mc.onPress = function() {
myBitmapData.floodFill(_xmouse, _ymouse, 0x000000FF);
}


Все удовлетворительно работает, только нужно заливку реализовать в отдельном клипе, дабы к примеру потом работать с прозрачностью заливки либо еще что-то.
Подскажите, пожалуйста, возможно ли как-то реализовать подобное?
Очень важно чтоб залитая область в итоге оказалась именно в новом клипе, а в битмапе все осталось без изменений.
Если что-то непонятно - уточню.

dimarik
05.06.2009, 15:28
Это сложно и медленно.

Волгоградец
05.06.2009, 16:02
Ну создайте клип и в нем методами drawing API рисуйте. Или битмап дату поместите туда.

Offi
10.06.2009, 18:34
dimarik
"Сложно и медленно" - это как я понимаю если делать через getPixel(), setPixel() в цикле волнового алгоритма...?
Я очень наделялся, что возможно будет это сделать через стандартную функцию:( Не представляете как я был рад, когда понял, что для заливки не придется писать вышеназванный алгоритм обнаружив функцию floodFill, а получается что результат работы floodFill в другое место я не перенаправлю...

Волгоградец
"методами drawing API" - это moveTo(),lineTo()? думаю это никак мне не поможет

Stargazer
10.06.2009, 18:49
А нельзя ли сохранить битмапу до заливки, потом сделать заливку, а потом сравнить новый битмап со старым и получить область заливки? Потом её перенести.

Волгоградец
10.06.2009, 18:52
Да, методами moveTo(), lineTo(), beginFill(), endFill().
Если не предполагается передвигать заливку, а только менять цвет - можно методом threshold() попробовать - но так затронутся другие области с таким же цветом как заливка.

Offi
10.06.2009, 19:48
Stargazer
Я тоже об этом думал, но не знаю возможно ли это стандартными средствами.

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

Волгоградец
threshold() из-за затрагивания других областей непокатит, да и передвигать заливку нужно будет...
а как с помощю moveTo(), lineTo() мне из исходного битмапа сделать заливку неправильной фигуры ограниченой другим цветом?

Stargazer
10.06.2009, 20:18
Если не возможно, то сравнительно быстрей будет работать самописный floodFill отсылающий результаты в другой клип нежели самописная проверка идентичности старого и нового битмапов.

Может, какой-нибудь overlay с вычитанием положить?

silin
10.06.2009, 21:04
можно threshold'ом
только он не только то, что floodFill нашел пропустит, но и все пиксели с 0x000000FF, что может быть и не критично, если красить каким-нить экзотичным цветом

myBitmapData.floodFill(mc._xmouse, mc._ymouse, 0x000000FF);
var maskBmd:BitmapData = new BitmapData(myBitmapData.width, myBitmapData.height, true, 0xFF000000);

maskBmd.threshold(myBitmapData, maskBmd.rectangle, new Point(), "!=", 0x000000FF, 0x0, 0x00FFFFFF, false);