繁体   English   中英

使用半透明png遮罩画布

[英]Masking a canvas with semi-transparent png

我想制作一个Web应用程序,当用户将画布悬停在黑白图像上时,用户可以显示颜色。

我的第一个尝试是在画布上使用bw图像设置css背景图像,并在画布上显示带有绘制圆圈的彩色图像。 这样,圆就具有坚实的边缘,但是我想要的是一个边缘褪色的圆。 有没有办法显示半透明png而不是纯画布圆圈的彩色图像?

希望这张图片能更好地解释我如何工作。

我知道这不是问题的直接答案,但是您是否考虑过从canvas切换到svg。 svg内置了一些不错的过滤器机制。 当前的chrome和firefox版本支持它。 IE10也会。

这是一个示例页面:

http://ie.microsoft.com/testdrive/Graphics/hands-on-css3/hands-on_svg-filter-effects.htm

从processing.js框架开始了一个小项目。 仍然需要大量工作。 但是也许,它为您指明了正确的方向:

编辑:代码中的一些其他编辑

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script type="text/javascript" src="processing-1.3.6.js"></script>
    </head>
    <body style="background-color:blue">
        <div id="container" style="background-image: url('testgrey.jpg');overflow:hidden;background-clip:content-box;width: 400px;height: 400px" >
            <canvas id="test" width="400" height="400"></canvas>
        </div>
        <script type="text/processing" data-processing-target="test">

        /* @pjs preload="test.jpg"; */
        /* @pjs transparent=true; */
        int nX, nY;
        int radius = 40;
        double powRadius = Math.pow(radius,2);

        void setup()
        {
        size(400,400);
        frameRate( 25 );
        background(0,0,0,0);
        a = loadImage("test.jpg");
        }

        void draw(){ 

        int left = nX - radius;
        int right = left + radius * 2;
        int top = nY - radius;
        int bottom = top + radius * 2;
        for (int j = top; j <= bottom; ++j)
        {
        for (int k = left; k <= right; ++k)
        {
        double dist = Math.pow(nX - k, 2.0) + Math.pow(nY - j, 2.0);
        if (dist <= powRadius)
        {
        color original= a.get(k,j);
        int newAlpha = 255-dist / powRadius*255;
        if(alpha(get(k,j))<newAlpha){
        color toDraw = color(red(original),green(original),blue(original),newAlpha);
        set(k,j,toDraw);
        }
        }
        }
        }

        }

        void mouseMoved(){
        nX = mouseX;
        nY = mouseY;  
        }
        </script>
    </body>
</html>

您需要两个图像来执行此操作:test.jpg和testgrey.jpg。

您可以尝试图形上下文的复合操作

http://www.html5canvastutorials.com/advanced/html5-canvas-global-composite-operations-tutorial/

演示: http : //jsfiddle.net/HdyBG/7/

使用函数createRadialGradient可以创建渐变填充。

演示: http : //jsfiddle.net/AuQTD/7/

我希望您可以将两者结合起来实现所需的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM