2012-12-26 19 views
5

SVG feComponentTransfer线性函数不能像我期望的那样工作。应用于灰度图像的斜率-1和截距1应该反转图像:黑色 - >白色,白色 - >黑色,25%灰色 - > 75%灰色,50%灰色不变,依此类推。我的期望基于http://www.w3.org/TR/filter-effects/#feComponentTransferElement,它表示“C'=斜率* C +截距”其中“C是初始分量(例如'feFuncR'),C'是重新映射的分量;两者都在闭合区间[0,1]。“。svg feComponentTransfer线性函数

以下滤波器

<filter id="linear"> 
    <feComponentTransfer> 
    <feFuncR type="linear" slope="-1" intercept="1" /> 
    <feFuncG type="linear" slope="-1" intercept="1" /> 
    <feFuncB type="linear" slope="-1" intercept="1" /> 
    </feComponentTransfer> 
</filter> 

映射黑到白和白到黑,但中间值是关,例如50%的灰色地图为90%的灰色,75%的灰色地图为98%的灰色。一个简单的例子见http://jsfiddle.net/Rpjs2/。我在Firefox和Safari中获得相同的结果。

这是我第一次尝试SVG过滤器,所以我怀疑我误解了规范。有人能纠正我吗?

+0

查看WebKit源代码中的[this example](http://src.chromium.org/chrome/branches/WebKit/195/LayoutTests/svg/custom/feComponentTransfer-Linear.svg)。使用类似的过滤器会“倒置”渐变(查看过滤器定义,因为描述它们的文本不正确),但并不完美。它似乎有点向左移动。 – seliopou

+0

它实际上已经向左移动了很多,远不及通过应用-1 * c + 1而得到的值。我的第一个想法是,这是一个错误,因为它不符合w3规范,但Safari和Firefox以相同(显然是错误的)方式实现它是很奇怪的。我向Mozilla和WebKit提交了错误报告,如果他们认为它是一个错误,他们会报告回来。 – BobW

+0

您在web平台文档中激发了我对doc feComponentTransfer的启发。让我知道你的想法:http://docs.webplatform.org/wiki/svg/elements/feComponentTransfer –

回答

5

过滤器通常在linearRGB色彩空间中工作。该用例要sRGB的,所以你只需要设置color-interpolation-filters =“sRGB的”滤芯

+0

谢谢,我只是试过。它适用于Firefox和Chrome,但Safari会忽略它的设置。 (令人恼火的是,Safari的发布版本使用的是旧版本的WebKit,而不是Chrome。在Safari中有很多SVG bug在几个月前在WebKit中被修复,并且没有出现在Chrome中。) – BobW

0

上,你可以大多修正这种使用原来的陆续组件转移。

<feComponentTransfer> 
    <feFuncR type="gamma" offset="0" amplitude="1" exponent="4.84"/> 
    <feFuncG type="gamma" offset="0" amplitude="1" exponent="4.84"/> 
    <feFuncB type="gamma" offset="0" amplitude="1" exponent="4.84"/> 
    </feComponentTransfer> 

这将使用2.2^2 = 4.84的“双”伽马校正更适当地分散颜色范围。