javascript - HTML JavaScript Canvas 颜色变化

标签 javascript html canvas colors drawing

我有一个正在处理的小项目,我对 HTML 以及其中的任何脚本完全陌生。我有一些逻辑上(对我来说)有意义的代码,但由于某种原因它不起作用。我正在使用我发现的一些代码来使用 Canvas 制作绘图工具,但我无法通过下拉菜单更改颜色。到目前为止我有这段代码。

<!--drop down box for selected drawing tools-->
<p><label>Select Tool: <select id = "selectedTool">
    <option value="rectangle">Rectangle</option>
    <option value="pencil">Pencil</option>
    <option value="line">Line</option>
</select></label></p>

<!--drop down box for selected colors.-->
<p><label>Color: <select id="selectedColor">
    <option value="red">Red</option>
    <option value="blue">Blue</option>
    <option value="green">Green</option>
</select></label></p>

对于我的绘图函数方法,我有:

var color_select = document.getElementById('selectedColor');
this.mousemove = function (ev) {
  if (tool.started){
    context.lineTo(ev._x, ev._y);
    var color_select = document.getElementById('selectedColor');
    if(color_select == red)
        context.strokeStyle = 'red';
    else if(color_select == blue)
        context.strokeStyle = 'blue';
    else if(color_select == green)
        context.strokeStyle = 'green';
    context.stroke();
  }
};

这完全杀死了绘图工具。下面我将发布完整的代码,以防它与我上面的内容无关。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Simmons Stitching v1.0.0</title>
<style type="text/css"><!--
#container { position: relative; }
#imageView { border: 1px solid #000; }
--></style>
</head>

<body>
<!--drop down box for selected drawing tools-->
<p><label>Stitching Tool: <select id="selectedTool">
<option value="rectangle">Rectangle</option>
<option value="pencil">Pencil</option>
<option value="line">Line</option>
</select></label></p>

<!--drop down box for selected colors.-->
<p><label>Color: <select id="selectedColor">
<option value="red">Red</option>
<option value="blue">Blue</option>
<option value="green">Green</option>
</select></label></p>

<!-- ... -->
</body>
<body>
<div id="container">
<canvas id="imageView" width="400" height="300">
<p>Wrong browser for this application sucka!  Get a browser worth having!</p>
<p>Try one of these: <a href="http://www.opera.com">Opera</a>, <a 
      href="http://www.mozilla.com">Firefox</a>, <a 
      href="http://www.apple.com/safari">Safari</a>, and <a 
      href="http://www.konqueror.org">Konqueror</a>.</p>
</canvas>
</div>

<script type="text/javascript" 
src="example1.js">
</script>



<script>

// Keep everything in anonymous function, called on window load.
if(window.addEventListener) {
window.addEventListener('load', function () {
var canvas, context, canvaso, contexto;

// The active tool instance.
var tool;
var tool_default = 'line';

function init () {
// Find the canvas element.
canvaso = document.getElementById('imageView');
if (!canvaso) {
  alert('Error: I cannot find the canvas element!');
  return;
}

if (!canvaso.getContext) {
  alert('Error: no canvas.getContext!');
  return;
}

// Get the 2D canvas context.
contexto = canvaso.getContext('2d');
if (!contexto) {
  alert('Error: failed to getContext!');
  return;
}

// Add the temporary canvas.
var container = canvaso.parentNode;
canvas = document.createElement('canvas');
if (!canvas) {
  alert('Error: I cannot create a new canvas element!');
  return;
}

canvas.id     = 'imageTemp';
canvas.width  = canvaso.width;
canvas.height = canvaso.height;
container.appendChild(canvas);

context = canvas.getContext('2d');

// Get the tool select input.
var tool_select = document.getElementById('selectedTool');
if (!tool_select) {
  alert('Error: failed to get the selectedTool element!');
  return;
}
tool_select.addEventListener('change', ev_tool_change, false);

// Activate the default tool.
if (tools[tool_default]) {
  tool = new tools[tool_default]();
  tool_select.value = tool_default;
}

// Attach the mousedown, mousemove and mouseup event listeners.
canvas.addEventListener('mousedown', ev_canvas, false);
canvas.addEventListener('mousemove', ev_canvas, false);
canvas.addEventListener('mouseup',   ev_canvas, false);
}

// The general-purpose event handler. This function just determines the mouse 
// position relative to the canvas element.
function ev_canvas (ev) {
if (ev.layerX || ev.layerX == 0) { // Firefox
  ev._x = ev.layerX;
  ev._y = ev.layerY;
} else if (ev.offsetX || ev.offsetX == 0) { // Opera
  ev._x = ev.offsetX;
  ev._y = ev.offsetY;
}

// Call the event handler of the tool.
var func = tool[ev.type];
if (func) {
  func(ev);
}
}

// The event handler for any changes made to the tool selector.
function ev_tool_change (ev) {
if (tools[this.value]) {
  tool = new tools[this.value]();
}
}

// This function draws the #imageTemp canvas on top of #imageView, after which 
// #imageTemp is cleared. This function is called each time when the user 
// completes a drawing operation.
function img_update () {
    contexto.drawImage(canvas, 0, 0);
    context.clearRect(0, 0, canvas.width, canvas.height);
}

// This object holds the implementation of each drawing tool.
var tools = {};

// The drawing pencil.
tools.pencil = function () {
var tool = this;
this.started = false;

// This is called when you start holding down the mouse button.
// This starts the pencil drawing.
this.mousedown = function (ev) {
    context.beginPath();
    context.moveTo(ev._x, ev._y);
    tool.started = true;
};

// This function is called every time you move the mouse. Obviously, it only 
// draws if the tool.started state is set to true (when you are holding down 
// the mouse button).
var color_select = document.getElementById('selectedColor');
this.mousemove = function (ev) {
  if (tool.started){
    context.lineTo(ev._x, ev._y);
    //******************************************************************************
    var color_select = document.getElementById('selectedColor');
    if(color_select == red)
        context.strokeStyle = 'red';
    else if(color_select == blue)
        context.strokeStyle = 'blue';
    else if(color_select == green)
        context.strokeStyle = 'green';
    context.stroke();
  }
};

// This is called when you release the mouse button.
this.mouseup = function (ev) {
  if (tool.started) {
    tool.mousemove(ev);
    tool.started = false;
    img_update();
  }
};
};

// The rectangle tool.
tools.rectangle = function () {
var tool = this;
this.started = false;

this.mousedown = function (ev) {
  tool.started = true;
  tool.x0 = ev._x;
  tool.y0 = ev._y;
};

this.mousemove = function (ev) {
  if (!tool.started) {
    return;
  }

  var x = Math.min(ev._x,  tool.x0),
      y = Math.min(ev._y,  tool.y0),
      w = Math.abs(ev._x - tool.x0),
      h = Math.abs(ev._y - tool.y0);

  context.clearRect(0, 0, canvas.width, canvas.height);

  if (!w || !h) {
    return;
  }

  context.strokeRect(x, y, w, h);
};

this.mouseup = function (ev) {
  if (tool.started) {
    tool.mousemove(ev);
    tool.started = false;
    img_update();
  }
};
};

// The line tool.
tools.line = function () {
var tool = this;
this.started = false;

this.mousedown = function (ev) {
  tool.started = true;
  tool.x0 = ev._x;
  tool.y0 = ev._y;
};

this.mousemove = function (ev) {
  if (!tool.started) {
    return;
  }

  context.clearRect(0, 0, canvas.width, canvas.height);

  context.beginPath();
  context.moveTo(tool.x0, tool.y0);
  context.lineTo(ev._x,   ev._y);
  context.stroke();
  context.closePath();
};

this.mouseup = function (ev) {
  if (tool.started) {
    tool.mousemove(ev);
    tool.started = false;
    img_update();
  }
};
};

init();

}, false); }

// vim:set spell spl=en fo=wan1croql tw=80 ts=2 sw=2 sts=2 sta et ai cin fenc=utf-8    ff=unix:


</script>
<style type="text/css">
#container { position: relative; }
#imageView { border: 1px solid #000; }
#imageTemp { position: absolute; top: 1px; left: 1px; }
</style>

</body>
</html>

最佳答案

代码需要做一些小改动。在使用以下行选择颜色值时,

      var color_select = document.getElementById('selectedColor');

基本上它会返回一个 HTMLElementObject 而不是颜色。要从 html 元素中获取颜色,您需要检索该元素的值。使用,

 var color_select = document.getElementById('selectedColor').value;

对所有三个工具使用此颜色检查。使用下面粘贴的更新代码。干杯!

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Simmons Stitching v1.0.0</title>
<style type="text/css">
<!--
#container {
    position: relative;
}

#imageView {
border: 1px solid #000;
}
-->
</style>
</head>

<body>
<!--drop down box for selected drawing tools-->
<p>
    <label>Stitching Tool: <select id="selectedTool">
            <option value="rectangle">Rectangle</option>
            <option value="pencil">Pencil</option>
            <option value="line">Line</option>
    </select></label>
</p>

<!--drop down box for selected colors.-->
<p>
    <label>Color: <select id="selectedColor">
            <option value="red">Red</option>
            <option value="blue">Blue</option>
            <option value="green">Green</option>
    </select></label>
</p>

<!-- ... -->
</body>
<body>
<div id="container">
    <canvas id="imageView" width="400" height="300">
<p>Wrong browser for this application sucka!  Get a browser worth having!</p>
<p>Try one of these: <a href="http://www.opera.com">Opera</a>, <a
                href="http://www.mozilla.com">Firefox</a>, <a
                href="http://www.apple.com/safari">Safari</a>, and                 <a
                href="http://www.konqueror.org">Konqueror</a>.</p>
</canvas>
</div>



<script>
    // Keep everything in anonymous function, called on window load.
    if (window.addEventListener) {
        window
                .addEventListener(
                        'load',
                        function() {
                            var canvas, context, canvaso, contexto;

                            // The active tool instance.
                            var tool;
                            var tool_default = 'line';

                            function init() {
                                // Find the canvas element.
                                canvaso = document
                                        .getElementById('imageView');
                                if (!canvaso) {
                                    alert('Error: I cannot find the canvas element!');
                                    return;
                                }

                                if (!canvaso.getContext) {
                                    alert('Error: no canvas.getContext!');
                                    return;
                                }

                                // Get the 2D canvas context.
                                contexto = canvaso.getContext('2d');
                                if (!contexto) {
                                    alert('Error: failed to getContext!');
                                    return;
                                }

                                // Add the temporary canvas.
                                var container = canvaso.parentNode;
                                canvas = document.createElement('canvas');
                                if (!canvas) {
                                    alert('Error: I cannot create a new canvas element!');
                                    return;
                                }

                                canvas.id = 'imageTemp';
                                canvas.width = canvaso.width;
                                canvas.height = canvaso.height;
                                container.appendChild(canvas);

                                context = canvas.getContext('2d');

                                // Get the tool select input.
                                var tool_select = document
                                        .getElementById('selectedTool');
                                if (!tool_select) {
                                    alert('Error: failed to get the selectedTool element!');
                                    return;
                                }
                                tool_select.addEventListener('change',
                                        ev_tool_change, false);

                                // Activate the default tool.
                                if (tools[tool_default]) {
                                    tool = new tools[tool_default]();
                                    tool_select.value = tool_default;
                                }

                                // Attach the mousedown, mousemove and mouseup event listeners.
                                canvas.addEventListener('mousedown',
                                        ev_canvas, false);
                                canvas.addEventListener('mousemove',
                                        ev_canvas, false);
                                canvas.addEventListener('mouseup',
                                        ev_canvas, false);
                            }

                            // The general-purpose event handler. This function just determines the mouse 
                            // position relative to the canvas element.
                            function ev_canvas(ev) {
                                if (ev.layerX || ev.layerX == 0) { // Firefox
                                    ev._x = ev.layerX;
                                    ev._y = ev.layerY;
                                } else if (ev.offsetX || ev.offsetX == 0) { // Opera
                                    ev._x = ev.offsetX;
                                    ev._y = ev.offsetY;
                                }

                                // Call the event handler of the tool.
                                var func = tool[ev.type];
                                if (func) {
                                    func(ev);
                                }
                            }

                            // The event handler for any changes made to the tool selector.
                            function ev_tool_change(ev) {
                                if (tools[this.value]) {
                                    tool = new tools[this.value]();
                                }
                            }

                            // This function draws the #imageTemp canvas on top of #imageView, after which 
                            // #imageTemp is cleared. This function is called each time when the user 
                            // completes a drawing operation.
                            function img_update() {
                                contexto.drawImage(canvas, 0, 0);
                                context.clearRect(0, 0, canvas.width,
                                        canvas.height);
                            }

                            // This object holds the implementation of each drawing tool.
                            var tools = {};

                            // The drawing pencil.
                            tools.pencil = function() {
                                var tool = this;
                                this.started = false;

                                // This is called when you start holding down the mouse button.
                                // This starts the pencil drawing.
                                this.mousedown = function(ev) {
                                    context.beginPath();
                                    context.moveTo(ev._x, ev._y);
                                    tool.started = true;
                                };

                                // This function is called every time you move the mouse. Obviously, it only 
                                // draws if the tool.started state is set to true (when you are holding down 
                                // the mouse button).
                                var color_select = document
                                        .getElementById('selectedColor');
                                this.mousemove = function(ev) {
                                    if (tool.started) {
                                        // Get the value of html element                   *********************************New changes
                                        var color_select = document
                                                .getElementById('selectedColor').value;

                                        //The string literals should be inside ' or ". Use these changes for other tools also. *********************************New changes
                                        if (color_select == 'red') {

                                            context.strokeStyle = 'red';
                                        } else if (color_select == 'blue') {

                                            context.strokeStyle = 'blue';
                                        } else if (color_select == 'green') {

                                            context.strokeStyle = 'green';
                                        }
                                        context.lineTo(ev._x, ev._y);
                                        context.stroke();

                                    }
                                };

                                // This is called when you release the mouse button.
                                this.mouseup = function(ev) {
                                    if (tool.started) {
                                        tool.mousemove(ev);
                                        tool.started = false;
                                        img_update();
                                    }
                                };
                            };

                            // The rectangle tool.
                            tools.rectangle = function() {
                                var tool = this;
                                this.started = false;

                                this.mousedown = function(ev) {
                                    tool.started = true;
                                    tool.x0 = ev._x;
                                    tool.y0 = ev._y;
                                };

                                this.mousemove = function(ev) {
                                    if (!tool.started) {
                                        return;
                                    }
                                    // *********************************New changes
                                    if (tool.started) {

                                        var color_select = document
                                                .getElementById('selectedColor').value;

                                        if (color_select == 'red') {

                                            context.strokeStyle = 'red';
                                        } else if (color_select == 'blue') {

                                            context.strokeStyle = 'blue';
                                        } else if (color_select == 'green') {

                                            context.strokeStyle = 'green';
                                        }

                                        var x = Math.min(ev._x, tool.x0), y = Math
                                                .min(ev._y, tool.y0), w = Math
                                                .abs(ev._x - tool.x0), h = Math
                                                .abs(ev._y - tool.y0);

                                        context
                                                .clearRect(0, 0,
                                                        canvas.width,
                                                        canvas.height);

                                        if (!w || !h) {
                                            return;
                                        }

                                        context.strokeRect(x, y, w, h);
                                    }
                                };

                                this.mouseup = function(ev) {
                                    if (tool.started) {
                                        tool.mousemove(ev);
                                        tool.started = false;
                                        img_update();
                                    }
                                };
                            };

                            // The line tool.
                            tools.line = function() {
                                var tool = this;
                                this.started = false;

                                this.mousedown = function(ev) {
                                    tool.started = true;
                                    tool.x0 = ev._x;
                                    tool.y0 = ev._y;
                                };

                                this.mousemove = function(ev) {
                                    if (!tool.started) {
                                        return;
                                    }
                                    // *********************************New changes
                                    if (tool.started) {

                                        var color_select = document
                                                .getElementById('selectedColor').value;

                                        if (color_select == 'red') {

                                            context.strokeStyle = 'red';
                                        } else if (color_select == 'blue') {

                                            context.strokeStyle = 'blue';
                                        } else if (color_select == 'green') {

                                            context.strokeStyle = 'green';
                                        }

                                        context
                                                .clearRect(0, 0,
                                                        canvas.width,
                                                        canvas.height);

                                        context.beginPath();
                                        context.moveTo(tool.x0, tool.y0);
                                        context.lineTo(ev._x, ev._y);
                                        context.stroke();
                                        context.closePath();
                                    }
                                };

                                this.mouseup = function(ev) {
                                    if (tool.started) {
                                        tool.mousemove(ev);
                                        tool.started = false;
                                        img_update();
                                    }
                                };
                            };

                            init();

                        }, false);
    }

    // vim:set spell spl=en fo=wan1croql tw=80 ts=2 sw=2 sts=2 sta et ai cin fenc=utf-8    ff=unix:
</script>
<style type="text/css">
#container {
position: relative;
}

#imageView {
border: 1px solid #000;
}

#imageTemp {
position: absolute;
top: 1px;
left: 1px;
}    

关于javascript - HTML JavaScript Canvas 颜色变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18093912/

相关文章:

javascript - 如何旋转 Canvas 中选定的元素

javascript - Canvas 应用程序在 IE9 中不工作,在 FF4b7 中工作不正常

Javascript随机图像及其链接

html - 使用 CSS 绘制重叠的椭圆

javascript - Bootstrap Switch,如何去除切换器的轮廓

html - 如何删除导航栏下拉菜单悬停周围的灰色框

javascript - Firefox 和 chrome 上的 Canvas 弧渲染差异

javascript - 为什么我的 ajax 请求得到响应 0?

javascript - "_"是否有创建键 => 值对象的快捷方式?

javascript - 我如何允许用户更改 ionic 中的应用程序背景颜色