Частичная перекраска растрового изображения во время выполнения - PullRequest
0 голосов
/ 09 декабря 2010

Я рисую несколько машин.Они растровые, загруженные из PNG в библиотеке.Мне нужно уметь раскрашивать машины - красные, зеленые и синие, что угодно.Однако, когда вы окрашиваете автомобиль в зеленый цвет, шины должны оставаться черными, а окна - окрашиваться в цвет окон.

Я знаю два способа справиться с этим, ни один из которых не делает меня счастливым.Во-первых, у меня могло быть два растровых изображения для каждой машины;один снизу для цвета тела, и один сверху для битов деталей.Нижнее растровое изображение получает свой transform.colorTransform, чтобы превратить белый автомобиль в любой нужный мне цвет.Не очень хорошо, потому что я получаю вдвое больше растровых изображений на экране во время выполнения.

Во-вторых, я могу программно искать и заменять "белый" на цвет "car-body" при загрузке растрового изображенияза каждую машину.Не очень хорошо, потому что объем памяти, который я занимаю, умножается на столько цветов, сколько мне нужно.

То, что я хотел бы, было бы способом сказать: «нарисуйте этот растровое изображение, ТОЛЬКО БЕЛЫЕ ЧАСТИ превратились в этот другой цвет»."во время выполнения.Есть ли что-нибудь подобное?Я буду менее чем удивлен, если ответ «нет», но я думаю, что стоит спросить.

Ответы [ 4 ]

1 голос
/ 13 декабря 2010

Возможно, вы ответили на вопрос самостоятельно.

Я думаю, что для вашего первого подхода потребуются только два прозрачных изображения: одно с пикселями частей, которые должны изменить цвет, другое с остальным изображением.Вы будете использовать colorTransform или ColorMatrix фильтр в каждом конкретном случае.Может ли даже работать с наличием пикселей, нуждающихся в смене цвета в Sprite с плоским цветом, наложенным на оверлей?Недостатком будет то, что вам нужно будет создать «карту цветов» / набор пикселей для замены для каждого отдельного элемента, который будет нуждаться в замене цвета.

Для второго подхода: вы можете изолировать области, используя что-то вроде порог () .

Для скорости вам может потребоваться либо сохранить индексы пикселей, которые необходимо заменить, в векторе. объект, который можно использовать в сочетании с методом BitmapData getVector () ,(Вы должны выполнить цикл один раз, чтобы получить индексы пикселей, которые необходимо заменить)

Поскольку вы будете использовать одно и то же изображение (одинаковые размеры), чтобы заполнить одно и то же содержимое другим цветом, вы всегда будете проходить по циклуте же пиксели.Также имейте в виду, что вы немного увеличите скорость, используя lock () перед циклом для setPixel () и unlock () после цикла.

В качестве альтернативы вы можете использовать Pixel Bender и попробовать некоторые методы вычитания зеленого экрана / фона.Он должен быть быстрым и не задерживать выполнение остальной части вашего кода as3, так как код Pixel Bender выполняется в своем собственном потоке.

Также проверьте технику вычитания Pixel Bender Ли.

Хотя сейчас оно немного старое, но вы также можете использовать некоторые знания из статьи @ Quasimondo.

HTH

0 голосов
/ 15 февраля 2013

Почему бы просто не загрузить кусочки по отдельности, выполнить преобразование цвета на том, который вы хотите изменить, а затем выполнить BitmapData.copyPixels () с результатом?Подпрограмма blit выполняется в машинном коде, поэтому быстро работает.Делать это попиксельно в ActionScript было бы слишком медленно по сравнению с ним.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#copyPixels()

0 голосов
/ 14 марта 2011

Возможно, вы захотите попробовать мое избирательное преобразование цвета: http://www.quasimondo.com/archives/000614.php - это с 2006 года, поэтому некоторые его части, возможно, теперь могут быть заменены фильтром пиксель-бендера.

0 голосов
/ 13 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...