Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Результат floodFill в другой клип (http://www.flasher.ru/forum/showthread.php?t=125912)

Offi 05.06.2009 00:07

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

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

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, что может быть и не критично, если красить каким-нить экзотичным цветом

Код AS1/AS2:

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);



Часовой пояс GMT +4, время: 10:50.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.