如果您的目标是 FP10,并且您想要一个简单的过滤器,就像您尝试使用 ColorTransform 一样,您可以编写一个 PixelBlender Kernel 来获取 2 个颜色参数(一个用于源,一个用于目标),将像素与源颜色匹配,并将它们换成目的地;像这样的东西:
//I release this under the MIT License. Use it to your heart's content.
<languageVersion : 1.0;>
kernel ReplaceColor
< namespace : "PIPEEP";
vendor : "PiPeep";
version : 1;
description : "Replace color";
>
{
input image4 src;
output pixel4 dst;
parameter pixel4 sColor
<
minValue:pixel4(0.);
maxValue:pixel4(255.);
>;
parameter pixel4 dColor;
parameter float tolerance;
void
evaluatePixel()
{
dst = sampleNearest(src,outCoord());
pixel4 sColorAdjusted = abs((sColor/pixel4(255.)) - dst);
if(sColorAdjusted.r < tolerance && sColorAdjusted.g < tolerance && sColorAdjusted.b < tolerance && sColorAdjusted.a < tolerance) {
dst = dColor;
}
}
}
记得他为什么讨厌 PixelBlender IDE
编辑:请记住,这与抗锯齿效果不佳,但如果您使用的是 stage.quality = "low",则没关系。
要在 as3 中添加使用它,试试这个(从http://scriptplayground.com/tutorials/as/Flash-CS4-and-Pixel-Bender-Overview/偷来的,所以你需要更改几行代码):
代码的第一部分是定义一些稍后使用的变量。唯一可能看起来很新的两个是 Shader 和 ShaderFilter。这些是 Flash Player 10 的新功能,是负责处理 Pixel Bender 过滤器数据的类。
var loader:URLLoader;
var shader:Shader;
var shaderFilter:ShaderFilter;
var image:MovieClip;
var timer:Timer;
var timerInt:uint = 40;
代码中的下一步是将图像加载到您在前面的步骤中添加的阶段。
image = new SampleImage(); image.y =
20; image.x = 25;
addChild(image);
要创建的前两个方法是用于加载 pbj 文件和初始化过滤器创建过程
function startEffect() { loader = new
URLLoader(); loader.dataFormat =
URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE,
loadComplete); loader.load(new
URLRequest("sample.pbj")); }
function loadComplete(e:Event):void {
shader = new Shader(loader.data);
initFilter(); }
成功加载 pbj 文件后调用next 函数initFilter()
,因此可以创建过滤器。此滤镜设置图像的 r、g、b 颜色值,这实际上破坏了图像的细节。例如,“ shader.data.red.value
”引用了开始编写的像素弯曲代码,如果您注意到代码有一个“参数 float red”,它是一个用于设置红色级别的浮点变量。在这种情况下,该值设置为 20。对其他 2 种颜色重复此过程,然后将其传递给图像实例。
此函数的最后一部分设置将运行以应用此过滤器的计时器,直到图像恢复其正常外观
function initFilter() {
shader.data.red.value = [20];
shader.data.green.value = [20];
shader.data.blue.value = [20];
shaderFilter = new
ShaderFilter(shader); image.filters =
[shaderFilter];
timer = new Timer(timerInt, 0);
timer.addEventListener(TimerEvent.TIMER,
timerHit); timer.start(); }
最后一个函数重复应用过滤器的过程,但首先获取当前过滤器值并从每次传递的值中减去 0.1。这个过程会慢慢地从图像中移除过滤器强度,直到它完全消失。timerHit()
从函数中创建的计时器调用此函数initFilter()
。
function timerHit(e:TimerEvent):void
{
if(shader.data.red.value == 1)
{
timer.stop();
return;
}
var r:uint = shader.data.red.value - 0.1;
var g:uint = shader.data.green.value - 0.1;
var b:uint = shader.data.blue.value - 0.1;
shader.data.red.value = [r];
shader.data.green.value = [g];
shader.data.blue.value = [b];
shaderFilter = new ShaderFilter(shader);
image.filters = [shaderFilter];
}
代码的最后一步是启动进程,在这个应用程序中是通过调用startEffect()
函数来完成的,这就是我们要做的
startEffect();
对不起让你的眼睛流血了!我想这是我最长的答案了!