着色灰度图像

时间:2012-12-26 16:53:29

标签: javascript image html5 svg svg-filters

我正在尝试使用用户选择的前景色和背景色(仅限于红色,绿色,蓝色,青色,品红色,黄色,黑色和白色)动态着色灰度图像。我想要的效果如下:

original grayscale http://crawdad.cornell.edu/test/1.png red foreground http://crawdad.cornell.edu/test/2.png red foreground, yellow background http://crawdad.cornell.edu/test/3.png

从左到右,它们显示原始灰度图像,用户选择红色作为背景颜色的图像,以及具有红色背景/黄色前景的相同图像。

每次用户选择颜色时在画布中重新绘制图像都是不切实际的(图像将为800x800px,我需要为动画创建30帧)。

我只针对最新版本的WebKit,Firefox和Internet Explorer,所以html5,css3和svg效果都很好。图片可以是直接的html <img>标记,也可以是<image>标记内的<svg>(后者实际上更可取)。

一个理想的解决方案可能涉及svg过滤器(我没有经验,他们可以这样做吗?)。另一种可能性可能是将我的灰度图像视为一个alpha通道,上面是纯色,下面是纯色(不知道我是怎么做的。)

对于具有Adobe Director经验的人,我想要的效果与Director的颜色和bgColor属性相同。 (我正在将项目从Director转换为html5 / javascript。)

3 个答案:

答案 0 :(得分:4)

欢迎来到SVG filter effects这个奇妙的世界,凡有可能做到的事情,但需要永远解决这个问题。下面是如何用红色和蓝色做你想做的事情的例子。混合可能不是您正在寻找的,您可能会从为颜色添加一些透明度中受益。

<svg>
  <defs>
    <filter x="0%" y="0%" width="100%" height="100%" id="mk">
      <feImage xlink:href="http://crawdad.cornell.edu/test/1.png" result="img"/>
      <feBlend in="img" in2="SourceGraphic" mode="multiply"> </feBlend>
    </filter>
  </defs>

  <rect width="100" height="100" fill="red" filter="url(#mk)" />
  <rect x="110" width="100" height="100" fill="blue" filter="url(#mk)" />
</svg>

feBlend元素还有一些您可以尝试的模式。此外,您可能会对feCompositefeColorMatrix元素感兴趣。

答案 1 :(得分:3)

好的,我有一个使用SVG过滤器的解决方案。

<defs>
    <filter id="colorize">
        <feComponentTransfer color-interpolation-filters="sRGB">
            <feFuncR id="fR" type="table" tableValues="0 1"/>
            <feFuncG id="fG" type="table" tableValues="0 1"/>
            <feFuncB id="fB" type="table" tableValues="0 1"/>
        </feComponentTransfer>
    </filter>
</defs>
<image  filter="url(#colorize)" x="0" y="0" width="100" height="100" xlink:href="urlOfGrayscaleImage"/>

然后使用JavaScript设置tableValues(为了简化,我给feFuncRid s),如下所示。每个tableValues中的第一个数字是应该替换图像中的黑色的值,第二个数字是应该替换白色的值。因此,要将黑/白变为红/黄,tableValuesfeFuncRfeFuncG的{​​{1}}为“1 1”,“0 1”和“0” 0“,分别。 (将rgb范围0-255映射到0-1。)

设置feFuncB至关重要。在别人向我指出之前,我昨天试图解决这个问题。

注意:截至12月27日,Safari会忽略color-interpolation-filters="sRGB",而Chrome和Firefox会使用它。我希望Safari使用更新的WebKit发布一个版本;这不是Safari中唯一挥之不去的SVG错误,早已在Chrome中修复过。

我希望这对某人有用!

答案 2 :(得分:0)

也许您可以选择节点并更改其属性。

In example

document.querySelector('#g2161').setAttribute('style','fill:blue');