JSFiddle - React, Tailwind, and code Playground
HTML
<canvas id="c" style="border: 0px; margin:70px;" width="500" height="120">
</canvas>
JavaScript
var c = document.getElementById("c");
var ctx = c.getContext("2d");
ctx.font = "25px monospace";
var bpercent = '??';
var wpercent = '??';
var opercent = '??';
var sleep = 2000;
function draw() {
ctx.fillStyle = "#FFFFFF";
ctx.fillRect(0,0,c.width,c.height);
ctx.fillStyle = "#000000";
ctx.fillText(bpercent + "% of this box is black",20,45);
//ctx.fillText(opercent + "% of this box is gray-ish",10,65);
ctx.fillText(wpercent + "% of this box is white",20,90);
//alert(1);
var d = ctx.getImageData(0,0,c.width,c.height);
var pixTotal;
for (var i = 0; i < d.data.length; i+=4) {
pixTotal = d.data[i] + d.data[i+1] + d.data[i+2];
d.data[i+3] = 255;
if (pixTotal < 200 && Math.random() > 0.2) {
d.data[i] = 255;
d.data[i+1] = 255;
d.data[i+2] = 255;
} else {
d.data[i] = 0;
d.data[i+1] = 0;
d.data[i+2] = 0;
}
}
ctx.putImageData(d,0,0);
//alert(1);
var w = 0;
var b = 0;
var o = 0;
var d = ctx.getImageData(0,0,c.width,c.height).data;
for (var i = 0; i < d.length; i+=4) {
pixTotal = d[i] + d[i+1] + d[i+2];
if (pixTotal == 0) {
b = b + 1;
} else if (pixTotal == 255 * 3) {
w = w + 1;
} else {
o = o + 1;
}
}
var newbPercent = b * 100.0 / (b+w+o);
newbPercent = newbPercent * 100;
newbPercent = Math.round(newbPercent)
newbPercent = newbPercent / 100.0;
var newwPercent = w * 100.0 / (b+w+o);
newwPercent = newwPercent * 100;
newwPercent = Math.round(newwPercent)
newwPercent = newwPercent / 100.0;
var newoPercent = o * 100.0 / (b+w+o);
newoPercent = newoPercent * 100;
newoPercent = Math.round(newoPercent)
newoPercent = newoPercent / 100.0;
if (bpercent == '??' || Math.abs(newbPercent-bpercent)>0.005 || Math.abs(newwPercent-wpercent)>0.005 || Math.abs(newoPercent-opercent)>0.005) {
bpercent = newbPercent;
wpercent = newwPercent;
opercent = newoPercent;
if (sleep > 1) {
sleep = sleep *.9;
...