如何通过位图图像上的彩虹动画制作动画

时间:2011-09-16 00:33:37

标签: flex actionscript-3 colors bitmap

我有一个位图(bitmapData),我希望它随着时间的推移改变颜色。我已经看到了应用颜色转换的例子,我无法让它工作。此外,通过这些示例,它们仅应用一种颜色。我想通过ROYGBIV系列制作动画。注意:我正在动态加载图片。如果有意义的话,我不想对图像中的颜色进行着色。我想要改变图像中的颜色。

2 个答案:

答案 0 :(得分:1)

你说你正在使用bitmapData,所以这个答案假设你可以/想要直接操作它。

您可以使用bitmapData.setPixel(row, column, color);更改像素的颜色。行和列基于0并且准确表示要修改的像素 - 如果您之前从未处理过这个问题,请将其视为网格纸。 color参数实际上是一个uint - 无符号整数。您可以使用十六进制值(如0x000000)将像素设置为黑色,将0xFFFFFF设置为白色。

要替换颜色,您可以循环浏览uint的不同值。有16777215种颜色的不同可能值,老实说,我不太了解十六进制颜色 - 我只是谷歌我想要的颜色。

但是,如果你有数学倾向,这里有一点提示: 十六进制数中的每个点对应于该点的功率的16或该点中的实际数字,以十进制表示。 我可能会说错了,所以这是一个可视的例子: 十六进制456789是(4 * 16 ^ 5)+(5 * 16 ^ 4)+(6 * 16 ^ 3)+(7 * 16 ^ 2)+(8 * 16 ^ 1)+(9 * 16 ^ 0 )十进制,等于4548489。

前两个点(左起)对应红色,然后是蓝色,然后是绿色。因此FF0000为红色,00FF00为绿色,0000FF为蓝色。您可以(我认为)在setPixel函数中提供颜色的十进制值,这样您就可以(或在线查找)一些转换来获得您想要的颜色/以彩虹样式模式循环颜色!

我希望这个关于Hex的随机速成课程很有帮助:P

答案 1 :(得分:1)

要操纵/着色,您可以使用colorTransform函数

说明:
在下面的示例中,我嵌入了图像并引用它,如果您使用的是adobe flash,您可以“命名”您的资产并在您的代码中引用它。

    import flash.geom.ColorTransform;
    import flash.events.Event;
    import flash.display.Bitmap;

    [Embed(source="img/logo.png")] private var logoCls:Class;
    private var bitmapLogo:Bitmap = new logoCls();

    public function Test()
    {
        addEventListener(Event.ADDED_TO_STAGE, init);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    private function init(e:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        addChild(bitmapLogo);
    }

    // r, g, b colors
    var r:int = 256; // start at Red
    var g:int = 0;
    var b:int = 0;
    var increment:int = 16; // how quickly to change the color
    var colorCycle:int = 0; 
    var mult:Number = 0.25; // How heavily TINTED you want the image

    private function onEnterFrame(e:Event):void
    {
        var ct:ColorTransform = new ColorTransform (1-mult,1-mult,1-mult,1,r*mult,g*mult,b*mult,0);
        bitmapLogo.transform.colorTransform = ct;
        incrementRainbowColors();
    }
    private function incrementRainbowColors():void
    {
        if (colorCycle == 0) // -> yellow
            if ((g+=increment) >= 256) colorCycle=1;
        else if (colorCycle == 1) // -> green
            if ((r-=increment) <= 0) colorCycle=2;
        else if (colorCycle == 2) // -> cyan
            if ((b+=increment) >=256) colorCycle=3;
        else if (colorCycle == 3) // -> blue
            if ((g-=increment) <= 0) colorCycle = 4;
        else if (colorCycle == 4) // -> magenta
            if ((r+=increment) >=256) colorCycle = 5;
        else if (colorCycle == 5) // -> red
            if ((b-=increment)<=0) colorCycle = 0;
    }

}