Маскировка холста с полупрозрачным png - PullRequest
0 голосов
/ 18 февраля 2012

Я хотел бы создать веб-приложение, в котором пользователь может при наведении курсора на черно-белое изображение отображать цвета.

Моей первой попыткой было установить фоновое изображение css на холсте с изображением bw и показать цветное изображение с нарисованным кругом на холсте.Таким образом, у круга есть сплошные края, но я хочу получить круг с выцветшими краями.Есть ли способ показать цветное изображение с полупрозрачным png вместо сплошного холстового круга?

Надеюсь Это изображение объяснит больше, как я хочу, чтобы все работало.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2012

Начал небольшой проект с фреймворком 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.

0 голосов
/ 19 февраля 2012

Вы можете попробовать составные операции графического контекста

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

demo: http://jsfiddle.net/HdyBG/7/

А с помощью функции createRadialGradient вы можете создавать градиентные заливки.

демо: http://jsfiddle.net/AuQTD/7/

Я надеюсь, что вы можете достичь того, что вам нужно, комбинируя эти два.

0 голосов
/ 18 февраля 2012

Я знаю, что это не прямой ответ на вопрос, но вы думали о переходе с canvas на svg.В SVG есть хорошая встроенная механика фильтров.Текущие версии Chrome и Firefox поддерживают это.IE10 тоже.

Вот пример страницы:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...