PDA

Просмотр полной версии : Манипулирование цветами в BitmapData


Волгоградец
25.06.2008, 18:49
Привет! Флэшеры, без вас не справлюсь. Задумал вот что: имеется на экране любой клип. Для простоты пускай будет красный (0хFF0000). Нужен след от него - для этого в каждом кадре я рисую битмапу, где фиксируется положение клипа. Получается как будто красным фломастером по холсту провел. С этим проблем нет. Далее хочу чтобы след темнел, т.е. в каждом шаге значение RR уменьшалось на какую-то величину. Для этого использую
var trans:Transform = new Transform(drawMc);
var r = 255 - n;
trans.colorTransform = new ColorTransform (1, 0, 0, 1, r, 0, 0, 0);
Проблема в том, что насыщенность конечной битмапы меняется целиком и когда я на новом шаге добавляю (метод draw) снова мой клип в изображение, он уже не 0хFF0000, а измененный на величину r. Но нужно чтобы только что добавленый элемент был красным и темнел со-временем. Вобщем чтобы как хвост у кометы получилось...
Блин, как тяжело бывает рассказать что нужно.

MrPoma
25.06.2008, 23:48
Если Вы используете битмап, то лучше заблюривать шлейф методом BitmapData.applyFilter(), в противном случае не вижу смысла использовать битмап.

Волгоградец
26.06.2008, 12:45
Не, блюром не получится - эффект будет применяться ко всей битмапе и шлейф будет равномерным.
Битмап использую т.к. это здорово уменьшает тормоза, т.к. на сцене всего один клип присутствует.
Вот, получил то что хотел. Если кому нужно - выложу класс.

Upd: вообщето тоже не то. Это будет работать только если шлейф плавно исчезает, но изменять цвет его не получится. Вобщем вот что нужно: нарисовать красный клип в битмапу, уменьшить красный канал и добавить немного зеленого. Следующий шаг: снова нарисовать красный клип в ту же битмапу и снова уменьшить красный канал и добавить немного зеленого. Таким образом тот рисунок, что добавили на первом шаге должен быть более желтым чем тот, который добавили на втором. Но вот незадача, когда меняем значения каналов то новый добавляемый рисунок не красный, а с учетом изменения каналов на всех шагах. Если кто придумает алгоритм как это исправить - напишите.

qazwsx
26.06.2008, 13:37
Ну незнаю блюром тоже самое получается... С виду. Но разве твой колор трансформ не ко всму битмапу применится, или там только этот кружок будет?

Волгоградец
26.06.2008, 13:44
Не понял вопрос.
Блюром цвет никак не изменишь - допустим с красного на желтый.

Волгоградец
26.06.2008, 15:00
Вот, готов сформулировать проблему.
Вобщем нужно изменить offset изображения на определенную величину. Т.е. присутствуют в изображении два пиксела. Значения красных каналов равны R=100 и R=200 соответственно. Как можно задать их значение на 10 большее, т.е. чтобы стало R=110 и R=210??? Вроде встроенные фильтры этого не умеют (надеюсь я ошибаюсь)...

wvxvw
26.06.2008, 15:06
Попробуй BitmapData.threshold method.
Что оно делает: позволяет выбрать область битмапдаты базируясь на максимальном и минимальном значении для каналов и сделать с ней какое-то преобразование (например, затемнить)... немного заморочливо, но если будет время - попробую что-то такое сделать.

Волгоградец
26.06.2008, 15:26
Не выйдет - там в параметре задается цвет, который присвоится пикселам, а не зачение, на которое они изменятся.

MrPoma
26.06.2008, 15:37
Не выйдет - там в параметре задается цвет, который присвоится пикселам, а не зачение, на которое они изменятся.

Просто Вам придется сформировать цвет, на который они изменятся, перед тем, как присваивать его пикселу.

threshold + 0xA

crazyone
26.06.2008, 15:38
Эм... Как-то так подправил хелповский пример по BitmapData.colorTransform:
import flash.display.BitmapData;
import flash.geom.ColorTransform;
import flash.geom.Point;


var myBitmapData:BitmapData = new BitmapData(200, 80, false, 0x00FFFFFF);

var sx=0;
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(myBitmapData, this.getNextHighestDepth());

var nBD:BitmapData = new BitmapData(10, 80, false, 0x00FF0000);
mc.onEnterFrame = function() {
myBitmapData.colorTransform(myBitmapData.rectangle, new ColorTransform(1, 1, 1, 1, 0, 20, 0, 0));
myBitmapData.copyPixels(nBD,nBD.rectangle,new Point(sx,0));
sx+=10;
if(sx>200){
sx=0;
}
}


Или это не то, или я не понимаю, в чем у вас проблема.

Волгоградец
26.06.2008, 16:12
crazyone - это немного не то, но твоя строчка
ColorTransform(1, 1, 1, 1, 0, 20, 0, 0)
разбудила мой мозг. Это то, что нужно было.
Всем спасибо!
Вот то, что я хотел получить: