Apache flex 为什么Pixel Bender过滤器在Toolkit中的行为与Flex/Air应用程序中的行为不同?
好的,我试过这个更简单的过滤器,空气代码如下:Apache flex 为什么Pixel Bender过滤器在Toolkit中的行为与Flex/Air应用程序中的行为不同?,apache-flex,filter,air,pixel-bender,hsv,Apache Flex,Filter,Air,Pixel Bender,Hsv,好的,我试过这个更简单的过滤器,空气代码如下: <languageVersion : 1.0;> kernel NewFilter < namespace : "Your Namespace"; vendor : "Your Vendor"; version : 1; description : "your description"; > { input image4 src; output pixel4 dst;
<languageVersion : 1.0;>
kernel NewFilter
< namespace : "Your Namespace";
vendor : "Your Vendor";
version : 1;
description : "your description";
>
{
input image4 src;
output pixel4 dst;
void
evaluatePixel()
{
pixel4 cPix = sampleNearest(src,outCoord());
pixel3 RGB = cPix .rgb;
float r = RGB.r;
float g = RGB.g;
float b = RGB.b;
//float minVal = min(r, g);
dst = pixel4(r, g, b, 1);
}
}
我正在尝试为flex应用程序制作pixel bender过滤器,它将输入图像的色调值的选定范围更改为定义的新色调值。
我在Pixel bender工具箱中制作了这样的过滤器,并给出了令人满意的结果
这是该过滤器的代码:
<languageVersion : 1.0;>
kernel ColorChange
< namespace : "Your Namespace";
vendor : "Your Vendor";
version : 1;
description : "your description";
>
{
input image4 src;
output pixel4 dst;
parameter float HUE
<
minValue: 0.;
maxValue: 359.9;
defaultValue: 0.;
>;
parameter float SAT
<
minValue: -1.;
maxValue: 1.;
defaultValue: 0.;
>;
parameter float VAL
<
minValue: -1.;
maxValue: 1.;
defaultValue: 0.;
>;
parameter float MIN_RANGE
<
minValue: 0.;
maxValue: 360.;
defaultValue: 0.;
>;
parameter float MAX_RANGE
<
minValue: 0.;
maxValue: 360.;
defaultValue: 360.;
>;
void
evaluatePixel()
{
pixel4 cPix = sample(src,outCoord());
pixel3 RGB = cPix.rgb;
float3 HSV;
//--------------------------------------------------------------
// CONVERT RGB TO HSV
//--------------------------------------------------------------
pixel1 r = RGB.r;
pixel1 g = RGB.g;
pixel1 b = RGB.b;
pixel1 minVal = min(min(r, g), b);
pixel1 maxVal = max(max(r, g), b);
pixel1 delta = maxVal - minVal;
HSV[2] = maxVal;
if (maxVal == 0.) {
HSV[0] = 0.;
HSV[1] = 0.;
}
else
{
HSV[1] = delta / maxVal;
}
if(r == maxVal)
HSV[0] = (g-b)/delta;
else if(g == maxVal)
HSV[0] = 2. + (b-r) / delta;
else
HSV[0] = 4. + (r-g) / delta;
HSV[0] *= 60.;
if(HSV[0] <0.)
HSV[0] += 360.;
//--------------------------------------------------------------
// FILTER RANGE OF HUE
//--------------------------------------------------------------
if((HSV[0] < MIN_RANGE) || (HSV[0] > MAX_RANGE))
{
dst = cPix;
}
else
{
//--------------------------------------------------------------
// CHNAGE HSV
//--------------------------------------------------------------
float hH = HUE;
float sS = SAT;
float vV = VAL;
HSV[0] = HUE;
HSV[1] += SAT;
if(HSV[1] > 1.)
HSV[1] = 1.;
else if(HSV[1] < 0.)
HSV[1] = 0.;
HSV[2] += VAL;
if(HSV[2] > 1.)
HSV[2] = 1.;
else if(HSV[2] < 0.)
HSV[2] = 0.;
//----------------------------------------------------------------------
// CONVERT HSV TO RGB
//----------------------------------------------------------------------
float h = HSV[0];// / 360.;
float s = HSV[1];// / 100. * 255.;
float v = HSV[2];// / 100. * 255.;
if (s == 0.) {
RGB.r = v;
RGB.g = v;
RGB.b = v;
} else {
h = h / 60.;
int var_i = int(floor(h));
float f = h - float(var_i);
float p = v * (1.-s);
float q = v * (1.-s*f);
float t = v * (1.-s*(1.-f));
if (var_i == 0) {
RGB.r = v;
RGB.g = t;
RGB.b = p;
}
else if (var_i == 1) {
RGB.r = q;
RGB.g = v;
RGB.b = p;
}
else if (var_i == 2) {
RGB.r = p;
RGB.g = v;
RGB.b = t;
}
else if (var_i == 3) {
RGB.r = p;
RGB.g = q;
RGB.b = v;
}
else if (var_i == 4) {
RGB.r = t;
RGB.g = p;
RGB.b = v;
}
else {
RGB.r = v;
RGB.g = p;
RGB.b = q;
}
}
dst = pixel4(RGB.r, RGB.g, RGB.b, 1);
}
}
}
内核颜色变化
<名称空间:“您的名称空间”;
供应商:“您的供应商”;
版本:1;
描述:“你的描述”;
>
{
输入image4src;
输出像素4dst;
参数浮动色调
<
最小值:0。;
最大值:359.9;
默认值:0。;
>;
参数浮点SAT
<
最小值:-1。;
最大值:1。;
默认值:0。;
>;
参数浮点值
<
最小值:-1。;
最大值:1。;
默认值:0。;
>;
参数浮动最小值范围
<
最小值:0。;
最大值:360。;
默认值:0。;
>;
参数浮动最大值范围
<
最小值:0。;
最大值:360。;
默认值:360。;
>;
无效的
evaluatePixel()
{
pixel4 cPix=样本(src,outCoord());
pixel3 RGB=cPix.RGB;
3型单纯疱疹病毒;
//--------------------------------------------------------------
//将RGB转换为HSV
//--------------------------------------------------------------
pixel1r=RGB.r;
像素1 g=RGB.g;
pixel1b=RGB.b;
pixel1 minVal=min(min(r,g),b);
像素1最大值=最大值(最大值(r,g),b);
像素1增量=最大值-最小值;
HSV[2]=maxVal;
如果(maxVal==0。){
HSV[0]=0。;
HSV[1]=0。;
}
其他的
{
HSV[1]=增量/最大值;
}
if(r==maxVal)
HSV[0]=(g-b)/delta;
else if(g==maxVal)
HSV[0]=2.+(b-r)/delta;
其他的
HSV[0]=4.+(r-g)/delta;
HSV[0]*=60。;
if(HSV[0]最大_范围))
{
dst=cPix;
}
其他的
{
//--------------------------------------------------------------
//技术单纯疱疹病毒
//--------------------------------------------------------------
浮动hH=色调;
浮动sS=SAT;
浮动vV=VAL;
HSV[0]=色调;
HSV[1]+=SAT;
如果(HSV[1]>1.)
HSV[1]=1。;
否则,如果(HSV[1]<0.)
HSV[1]=0。;
HSV[2]+=VAL;
如果(HSV[2]>1.)
HSV[2]=1。;
否则,如果(HSV[2]<0.)
HSV[2]=0。;
//----------------------------------------------------------------------
//将HSV转换为RGB
//----------------------------------------------------------------------
浮点h=HSV[0];///360。;
浮点数s=HSV[1];///100.*255。;
浮点v=HSV[2];///100.*255。;
如果(s==0。){
RGB.r=v;
RGB.g=v;
RGB.b=v;
}否则{
h=h/60。;
int var_i=int(楼层(h));
浮点数f=h——浮点数(var_i);
浮点数p=v*(1.-s);
浮点数q=v*(1.-s*f);
浮点数t=v*(1.-s*(1.-f));
如果(var_i==0){
RGB.r=v;
RGB.g=t;
RGB.b=p;
}
else if(var_i==1){
RGB.r=q;
RGB.g=v;
RGB.b=p;
}
else if(var_i==2){
RGB.r=p;
RGB.g=v;
RGB.b=t;
}
else if(var_i==3){
RGB.r=p;
RGB.g=q;
RGB.b=v;
}
否则,如果(var_Ui==4){
RGB.r=t;
RGB.g=p;
RGB.b=v;
}
否则{
RGB.r=v;
RGB.g=p;
RGB.b=q;
}
}
dst=像素4(RGB.r,RGB.g,RGB.b,1);
}
}
}
所以原理很简单,将每个像素转换为HSV颜色空间,检查色调是否在选定范围内,如果它确实将其色调更改为定义的色调,然后转换回RGB
问题是,当在Air应用程序中使用时,从只使用过滤器的默认参数开始,我并没有得到相同的结果
这是空气应用的代码:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
width="1400" height="800" backgroundAlpha="0.0" xmlns:mx="library://ns.adobe.com/flex/mx"
creationComplete="windowedapplication1_creationCompleteHandler(event)">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.events.ColorPickerEvent;
import mx.events.FlexEvent;
import spark.filters.ShaderFilter;
import spark.utils.BitmapUtil;
[Embed(source="myFilter.pbj", mimeType="application/octet-stream")]
private var MyBender:Class;
private var shader:Shader = new Shader();
private var shaderJob:ShaderJob;
private var shaderResult:BitmapData;
private function filter():void
{
// Configure desired input parameters of shader.
shader.data.src.input = originalImage.bitmapData;
// shader.data.HUE.value = [H_slider.value];
// shader.data.SAT.value = [S_slider.value];
// shader.data.VAL.value = [V_slider.value];
// shader.data.MAX_RANGE.value = [H_max_slider.value];
// shader.data.MIN_RANGE.value = [H_min_slider.value];
shaderJob = new ShaderJob(shader, shaderResult);
shaderJob.start(true);
bendedImage.source = new Bitmap(shaderResult);
}
private function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
{
// Create new shader instance and initialize with embedded byte code.
shader = new Shader(new MyBender());
shaderResult = new BitmapData(originalImage.width, originalImage.height);
filter();
}
]]>
</fx:Script>
<s:HGroup width="100%">
<s:Group id="originalGroup" width="100%">
<s:Image id="originalImage" source="mandelbrot.png"/>
</s:Group>
<s:Group id="bendedGroup" width="100%">
<s:SWFLoader id="bendedImage" source="mandelbrot.png" />
<s:HSlider id="H_slider" minimum="0" maximum="359.9" stepSize="0.1" value="0" change="filter()" width="500" toolTip="HUE"/>
<s:HSlider id="S_slider" minimum="-1" maximum="1" stepSize="0.1" value="0" y="20" change="filter()" width="500" toolTip="SAT"/>
<s:HSlider id="V_slider" minimum="-1" maximum="1" stepSize="0.1" value="0" y="40" change="filter()" width="500" toolTip="VAL"/>
<s:HSlider id="H_max_slider" minimum="0" maximum="360" stepSize="0.1" value="360" y="60" change="filter()" width="500" toolTip="HUE MAX"/>
<s:HSlider id="H_min_slider" minimum="0" maximum="360" stepSize="0.1" value="0" y="80" change="filter()" width="500" toolTip="HUE MIN"/>
</s:Group>
</s:HGroup>
</s:WindowedApplication>
因此,使用默认参数在Air app中应用PixelBender过滤器会产生以下结果:
http://i.stack.imgur.com/UyoZR.png
但在Pixel Bender Toolkit中,我看到了相同的参数:
http://i.imgur.com/LNnCi.png
更改应用程序中的“色调最大值”滑块(绑定到过滤器的“最大值范围”参数),它不会平滑地过滤掉色调值,而是在“色调最大值”为59.9时设置阈值,在较低的值时,看起来没有应用过滤器;在“色调最大值”为299.9时,介于60和299.9之间的值如下所示:
if (maxVal == 0.)
http://i.stack.imgur.com/5kePu.png
(对不起,新用户)
你知道我做错了什么吗?你的PB代码中有很多浮点比较。像这样的台词:
if (maxVal == 0.)
外部易受舍入误差的影响。我建议改用这样的方式:
if (abs(maxVal) < epsilon)
if(abs(maxVal)
您的AS代码中有注释掉的设置参数值的行。你能试试com吗
pixel1 minVal = r;
if(g < minVal)
minVal = g;
if(b < minVal)
minVal = b;
pixel1 minVal = min(min(r, g), b);