【问题标题】:Replace range of colors on HTML5 Canvas?替换 HTML5 Canvas 上的颜色范围?
【发布时间】:2020-07-09 11:08:43
【问题描述】:

我使用画布在照片上刻录的时间戳有问题。

目前,我将其着色为青色,然后应用差异过滤器来处理背景中的相似颜色。但是,当背景为灰色时,差异过滤器无法解决此问题,并且时间戳可能变得不可读。

是否可以在过滤器后仅在文本上查找一系列颜色并替换这些颜色?我正在考虑寻找一个灰色范围,然后用纯黑色或白色替换该范围。

我环顾四周,但似乎只能找到有关如何将这样的过滤器应用于整个图像的说明,而不仅仅是文本。

这是我现在做的一个例子,但在实际代码中我使用的是网络摄像头输入,所以图像绘制略有不同。

var image = new Image();
image.src = "http://i.stack.imgur.com/UFBxY.png";
image.onload = draw;

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

function drawImage(img, x, y, filter) {
  ctx.beginPath()
  ctx.filter = filter
  ctx.drawImage(img, x, y);
  ctx.closePath()
}

ctx.globalCompositeOperation = "difference";
ctx.fillStyle = "cyan";
ctx.fillText("Hello World!", 150, 100);

function draw() {
  drawImage(image, 0, 0, 'none');
}
<canvas id="canvas" width=500></canvas>

【问题讨论】:

  • 一个功能齐全的示例显示“时间戳可能变得不可读”问题可以帮助我们帮助您......您提供的代码将很难提供帮助

标签: javascript text colors html5-canvas


【解决方案1】:

很难准确判断您的情况。
...但这是一个想法,我们可以删除文本的“阴影”以使其弹出。
我要做的是把文本写两次,但有一点偏移

<canvas id="canvas" width=500></canvas>

<script>
    var pixelated = null
    var image = new Image();
    image.src = "http://i.stack.imgur.com/UFBxY.png";
    image.onload = draw;

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");

    function drawImage(img, x, y, filter) {
        ctx.beginPath()
        ctx.filter = filter
        ctx.drawImage(img, x, y);
        ctx.closePath()
    }

    function drawText(text, x, y) {
        ctx.font = "60px Verdana";
        ctx.fillStyle = "black";
        ctx.fillText(text, x + 2, y + 2);
        ctx.fillStyle = "cyan";
        ctx.fillText(text, x, y);
    }

    function draw() {
        drawImage(image, 0, 0, 'blur(1px)');
        drawImage(image, 140, 0, 'none');
        drawText("Hello World!", 40, 80)
    }
</script>

以下是它的外观:

下面是两个:


而且我认为这对小字体也很有效,比:globalCompositeOperation = "difference";
这使它成为一个看起来很奇怪的文本......

这里是用小字体写的,两个偏移一个像素的文本

var image = new Image();
image.src = "http://i.stack.imgur.com/UFBxY.png";
image.onload = draw;

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

function drawImage(img, x, y) {
  ctx.beginPath()
  ctx.drawImage(img, x, y);
  ctx.closePath()
}

function drawText(text, x, y) {
    ctx.shadowColor = "black";
    ctx.shadowBlur = 2;
    ctx.fillStyle = "black";
    ctx.fillText(text, x + 1, y + 1);
    ctx.fillText(text, x - 1, y - 1);
    ctx.fillStyle = "cyan";
    ctx.fillText(text, x, y);
}

function draw() {
  drawImage(image, 0, 0);
  drawText("Hello World!", 10, 10);
  drawText("Hello World!", 50, 50);
  drawText("Hello World!", 150, 100);
  
}
&lt;canvas id="canvas" width=500&gt;&lt;/canvas&gt;

【讨论】:

  • 对不起,我看看能不能写个代码示例,这对我不起作用,因为文本很小,所以阴影要么没有太大作用,要么变得非常分散图像的注意力。
  • 如果你想查看的话,我已经用 sn-p 更新了我的评论。
  • 我也更新了我的答案,我觉得小号的阴影效果很好,但是这么小的字体肯定不适合阅读
  • 我想要使用差异过滤器的“奇怪文本”。唯一的问题是当呈现灰色像素时,由于差异过滤器的工作方式,它变得不那么可读,所以我想知道如何指定颜色范围并用指定的颜色替换该范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2019-03-13
  • 2016-12-17
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
相关资源
最近更新 更多