【问题标题】:How to animate through a rainbow of colors on a bitmap image如何通过位图图像上的彩虹色进行动画处理
【发布时间】:2011-09-16 00:33:36
【问题描述】:

我有一个位图 (bitmapData),我希望它随时间改变颜色。我见过应用颜色变换的例子,但我无法让它工作。此外,在这些示例中,它们仅应用一种颜色。我想通过 ROYGBIV 范围制作动画。注意:我正在动态加载图像。我不想给图像着色我希望图像中的颜色在有意义的情况下改变。

【问题讨论】:

  • 还有创建您自己的 Pixel Bender 内核并通过位图上的着色器过滤器控制它的选项。对于性能,我认为这种方法是最好的。

标签: apache-flex actionscript-3 colors bitmap


【解决方案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;
    }

}

【讨论】:

  • 堆栈溢出要求您在发表评论之前输入至少 15 个字符。 “谢谢”少于 15 个字符。所以我总是想写至少 15 个字符的东西。
【解决方案2】:

你说你正在使用 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。

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

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

【讨论】:

  • 通过 setPixel 操作 bitmapData 非常慢,我最好使用 setPixels 或 setVector。位图生成的有趣链接:webr3.org/blog/haxe/…
  • 非常真实!我刚刚完成了 setPixel 的任务,所以我有点偏见哈哈。链接也很棒!
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2018-01-26
  • 2013-02-28
  • 2011-03-12
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多