【问题标题】:How to use a color picker for the canvas stroke color?如何为画布描边颜色使用颜色选择器?
【发布时间】:2013-12-10 21:00:03
【问题描述】:

在我的基本画布绘画工具中,我希望用户能够使用颜色选择器来更改笔触的颜色。所以我希望ctx.strokeStyle 更改为用户在颜色选择器上选择的任何颜色。我已经设法使用input type="color" 将颜色选择器添加到画布,但我想知道如何使画布中的笔触/画笔的颜色根据颜色选择器中选择的颜色而改变。

所以这是我现在的画布:

我希望用户使用这个来改变笔触颜色:

【问题讨论】:

  • 为什么不能在onchange 事件中获得它的价值? Here 是我在 jsfiddle 上找到的一个示例 here。 BTW,目前有些浏览器不支持type=color。如需列表,请查看link
  • +1+ 用于在浏览器中打开标签How to Ask :)
  • @wendelbsilva 谢谢,我会尝试破解...
  • 这是我的代码jsfiddle.net/KQHMA/2 -- 所以我希望以某种方式将笔触颜色更改为用户使用颜色选择器选择的任何颜色。
  • @user3088233 http://jsfiddle.net/wjAdP/。您只需要获取事件onchange 的颜色并将其设置为strokeStyle。从您的代码中,我添加了回调change。在此函数中,它将color value 设置为变量color。而在draw 方法中,它设置了strokeStyle

标签: javascript css html canvas


【解决方案1】:

根据您发布的图片,您似乎想要在他的回答中发布类似 markE 的解决方案。虽然,在你提到的文字中type="color"。如果你想使用这个输入,你可以检查这个jsfiddle 工作。在第二种情况下,请记住很多浏览器还不支持它。如果您想查看支持它的浏览器列表,请单击here

下面我将尝试详细说明我对您的 jsfiddle 所做的更改。

首先,您需要为颜色input 设置回调。这意味着当输入的值发生变化时,它会调用方法change。函数change 获取输入的value 并设置在一个名为color 的全局变量中。

var color = "rgb(255,0,0)";
function change(e){
    color = this.value;
}
document.getElementById("color").onchange = change;

另一个变化是在您的 draw 函数中。在抽奖之前,它获取变量color 中的值。这样,下次更改颜色时,它会更新笔划中使用的颜色。

ctx.strokeStyle = color;

通过这些更改,如果将来您决定使用其他工具来获取颜色(例如,您可以检查 browser 以查看它是否支持 input="color" 并在这种情况下使用不同的颜色选择器),您只需在变量color 中设置新颜色即可。

【讨论】:

    【解决方案2】:

    以下是“工具”画布上用于在绘图画布上设置当前颜色(填充/描边)的颜色选择器的简单示例:

    Javascript paint Canvas, need help re-locating buttons?

    对于您的“色轮”选择器,您可以在工具画布上绘制色轮,然后使用 context.getImageData 抓取鼠标光标下的像素颜色数据。

    var imgData=ctx.getImageData(mouseX,mouseY,1,1);
    
    var data=imgData.data;
    
    return("rgba("+data[0]+","+data[1]+","+data[2]+","+data[3]+")");
    

    用户在工具画布上选择颜色后,您可以使用 context.strokeStyle 和 context.fillStyle 使这些颜色在绘图画布上处于活动状态。

    【讨论】:

    • 这是我的代码 -- jsfiddle.net/KQHMA/2 你介意编辑它,以便根据颜色选择器改变笔触颜色吗?我会非常感激!谢谢
    • +1 这个解决方案看起来类似于问题中显示的图片中的颜色选择器
    • @Loktar 告诉我,这与他提出的picture 完全不同吗?现在我很感兴趣。
    • @wendelbsilva 我没有看他的照片,我只是看着小提琴。但是是的,根据他的形象,这也是一个很好的解决方案(对于像markE这样的跨浏览器来说更好)无论如何我会收回我的否决票但不能因为需要编辑答案,我匆忙投了反对票,一个教训我不应该在忙于其他任务时看问题:P
    【解决方案3】:

    您需要做的就是获取颜色输入的值并将strokeStyle 设置为该值。

    Live Demo

    var points=new Array(),
        colorInput = document.getElementById("color");
    
            function start(e){
              var mouseX = e.pageX - canvas.offsetLeft;
              var mouseY = e.pageY - canvas.offsetTop;
              paint = true;
              ctx.beginPath();
              ctx.moveTo(mouseX,mouseY);
              points[points.length]=[mouseX,mouseY];
            };
    
            function draw(e){
    
              if(paint){
                 var mouseX = e.pageX - canvas.offsetLeft;
                 var mouseY = e.pageY - canvas.offsetTop; 
                 ctx.lineTo(mouseX,mouseY);
                 ctx.stroke();  
    
                 // set the value to the color input
                 ctx.strokeStyle = colorInput.value;
    
                 ctx.lineJoin = ctx.lineCap = 'round';
    
                 points[points.length]=[mouseX,mouseY];
              }
    
            }
            function stop(e){
              paint=false;
             var s=JSON.stringify(points);
                localStorage['lines']=s;
            }  
    
    
    
            var paint=false;
            var canvas = document.getElementById('myCanvas');
            var ctx=canvas.getContext("2d");
            canvas.addEventListener('mousedown',start);
            canvas.addEventListener('mousemove',draw);
            canvas.addEventListener('mouseup',stop);
    

    【讨论】:

    • @markE 啊废话对不起,我没有注意用户名...我希望我不会如此匆忙地投票:(我无法删除它,因为需要编辑答案。另外我发誓他最初的问题没有像那样显示自定义颜色选择器。无论如何,我赞成你的另一个随机答案:P
    • heh 另一个评论,我猜他的图像总是这样,它最初只是一个链接,所以我跳过它,只是看着小提琴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多