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