【问题标题】:Glow Effect on HTML Canvas, Potentially Using Convolute Kernel / MatrixHTML Canvas 上的发光效果,可能使用卷积内核/矩阵
【发布时间】:2012-11-01 18:57:52
【问题描述】:

我正在将 PNG 图像绘制到 HTML 画布上,并且我已经实现了一个过滤器系统,以允许在图像数据被传送到画布之前对其执行卷积过滤器。

有没有人知道如何使用卷积核/矩阵(我不确定术语是什么,但我在谈论这些:http://www.html5rocks.com/en/tutorials/canvas/imagefilters/)或通过其他方式(例如使用)来创建发光效果globalCompositeOperation (https://developer.mozilla.org/samples/canvas-tutorial/6_1_canvas_composite.html)?

我知道您可以从低不透明度和缩放图像开始,然后在将图像缩小一点的同时增加不透明度。这可以创建一种发光效果,但仅限于图像边缘。

在理想情况下,能够使用辅助发光纹理指定具有发光的图像区域会很棒。关于这两种情况的任何想法? :)

【问题讨论】:

  • 你有一个视觉例子,一个之前/之后的例子,这样的效果会是什么样子?

标签: html image canvas effects glow


【解决方案1】:

希望以下内容符合您的预期,我认为结果非常好。所以我使用了来自the article 的滤镜库代码,并且刚刚为该库创建了一个新的发光滤镜,因为他的代码一开始就做得很好。这是一个Live Demo,展示了发光效果。

这是您需要添加到库中的过滤器代码

Filters.glow = function(pixels, passes, image, glowPasses){
        for(var i=0; i < passes; i++){  
            pixels = Filters.convolute(pixels, 
                [1/9,  1/9,  1/9,
                1/9,  1/9,  1/9,
                1/9,  1/9,  1/9 ]);
        }
        
        var tempCanvas = document.createElement("canvas"),
            glowCanvas = document.createElement("canvas"),
            tCtx = tempCanvas.getContext("2d"),
            gCtx = glowCanvas.getContext("2d");
        
        tempCanvas.width = glowCanvas.width = pixels.width;
        tempCanvas.height = tempCanvas.height = pixels.height;
        
        tCtx.putImageData(pixels, 0, 0);
        gCtx.drawImage(image, 0, 0);

        gCtx.globalCompositeOperation = "lighter";

        for(i = 0; i < glowPasses; i++){
            gCtx.drawImage(tempCanvas,0,0);
        }
        
        return Filters.getPixels(glowCanvas);
    }

这就是您使用上述过滤器的方式。

var glowImage = document.images[1],
    glowMask = document.images[0],
    c = document.getElementById("canvas"),
    ctx = c.getContext("2d");

window.onload = function() {
    var pData = Filters.filterImage(Filters.glow, glowImage, 5, glowMask, 2);
    c.width = pData.width;
    c.height = pData.height;
    ctx.putImageData(pData, 0, 0);
}

您需要为其提供 2 张图片。第一个是您想要发光的图像,第二个是应用于图像的实际发光蒙版。然后,您可以指定要执行多少次模糊传递,这会使辉光更加突出,以及要执行多少次辉光传递,这会将辉光添加到图像中。我将 lighter 全局组合用于 alpha 混合它的画布。

This article 是一个非常棒的关于创建发光效果的资源,它也是我获取图形的地方,以便根据他们的结果测试我的结果。

【讨论】:

  • 这正是,就像精确地,激光完美地瞄准了我正在寻找的东西。我认为这可能是我在 SO 上得到的第一个答案,回答的人实际上完全阅读了我的问题。严重的感谢。我显然不能在 11 小时内奖励赏金,但一旦我被允许就会这样做。干杯哥们。
  • @RobEvans 真棒很高兴它帮助了你:) 工作很有趣我喜欢发光效果的外观,你做了大部分工作来寻找画布过滤器的优秀库。
  • 我给 +1 只是因为 Rob 对这个问题的结果非常满意。每个人都赢了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多